Bro IDS on OpenWRT
While I was at SysNet, we had been working on a project we called “Shrimp” — Software-defined Home Router Intelligent Monitoring Point. The goal of the project was to provide a framework for easy programmatic access to network monitoring on low-cost, commodity, home router devices. One of the requirements was to have an IDS on the home routers for which we chose Bro — the leading framework for semantic analysis of network traffic.
The OpenWRT OS was chosen as the target platform. Its SDK contained a cross-compile toolchain for CMake projects. However, during the compilation Bro tried to run the binpac
and bifcl
executables for processing intermediate files. The executables refused to run on the build platform if the target platform architecture was different (mostly the case, e.g., we were building on x86-64
and target was arm
).
The (not-so-pretty ™) workaround we used was to build Bro twice. Once for the host, and once for the target. The CMake files were then patched to first generate binpac
and bifcl
binaries if they weren’t provided and then use the provided binaries if they were defined at make time. The first compile generated the binaries on x86-64
and the second compile (for arm
) used the earlier binaries to process the bif
files.
The Makefile and patches are available in this tarball: openwrt-bro.tar.gz, while the compiled ipk
package is also available for installation. Here is a test execution of Bro on OpenWRT:
# bro –v |
bro version 2.0
# cat test.bro |
event bro_init() { print "Hello World!"; } event new_connection(c: connection) { print "New connection created"; }
# bro test.bro |
Hello World!
# bro -i br-lan test.bro |
Hello World! New connection created New connection created
# ls |
conn.log notice_policy.log reporter.log weird.log dns.log packet_filter.log test.bro
A heap of thanks to Zaafar for dealing with my messy code and providing the links to hosted files :) !
Tags: Bro IDS, Code, Flag 42, Linux, Open Source, OpenWRT, Security, Shrimp, SysNet, Technology