Module Name: src Committed By: christos Date: Mon Jan 27 17:20:49 UTC 2025
Modified Files: src/external/bsd/blocklist/libexec: blocklistd-helper Log Message: PR/14: robohack: make packet filter detection more reliable and add explanatory comments. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/external/bsd/blocklist/libexec/blocklistd-helper Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/blocklist/libexec/blocklistd-helper diff -u src/external/bsd/blocklist/libexec/blocklistd-helper:1.9 src/external/bsd/blocklist/libexec/blocklistd-helper:1.10 --- src/external/bsd/blocklist/libexec/blocklistd-helper:1.9 Mon Jan 27 12:17:49 2025 +++ src/external/bsd/blocklist/libexec/blocklistd-helper Mon Jan 27 12:20:49 2025 @@ -14,19 +14,18 @@ if [ -f "/etc/ipfw-blocklist.rc" ]; then pf="ipfw" . /etc/ipfw-blocklist.rc ipfw_offset=${ipfw_offset:-2000} -else - # ipfilter NetBSD, FreeBSD, Linux - for f in /etc/ipf.conf /etc/ipf.rules /etc/netscript/ipfilter.conf; do - if [ -f "$f" ]; then - pf="ipf" - break - fi - done fi if [ -z "$pf" ]; then - for f in npf pf; do - if [ -f "/etc/$f.conf" ]; then + for f in npf pf ipfilter ipfw; do + if [ -x /etc/rc.d/$f ]; then + if /etc/rc.d/$f status >/dev/null 2>&1; then + pf="$f" + break + fi + elif [ -f "/etc/$f.conf" ]; then + # xxx assume a config file means it can be enabled -- + # and the first one wins! pf="$f" break fi @@ -69,14 +68,19 @@ esac case "$1" in add) case "$pf" in - ipf) + ipfilter) # N.B.: If you reload /etc/ipf.conf then you need to stop and - # restart blocklistd (and make sure blocklistd_flags="-r"): - # - # /etc/rc.d/ipfilter reload - # /etc/rc.d/blocklistd restart + # restart blocklistd (and make sure blocklistd_flags="-r"). + # This should normally already be implemented in + # /etc/rc.d/ipfilter, but if then not add the following lines to + # the end of the ipfilter_reload() function: + # + # if checkyesnox blocklistd; then + # /etc/rc.d/blocklistd restart + # fi # # XXX we assume the following rule is present in /etc/ipf.conf: + # (should we check? -- it probably cannot be added dynamically) # # block in proto tcp/udp from any to any head blocklistd # @@ -97,8 +101,8 @@ add) # actually block packets, and prevent logging of them as # connections, because they include the "quick" flag. # - # N.b.: $port is not included -- abusers are cut off completely - # from all services! + # N.b.: $port is not included/used in rules -- abusers are cut + # off completely from all services! # # Note RST packets are not returned for blocked SYN packets of # active attacks, so the port will not appear to be closed. @@ -111,12 +115,12 @@ add) # to open connections (see $flags above). This allows us to do # counterespionage against the attacker (or continue to make use # of any other services that might be on the same subnet as the - # attacker). However it does not kill any active connections -- - # we rely on the reporting daemon to do its own protection and - # cleanup. + # supposed attacker). However it does not kill any active + # connections -- we rely on the reporting daemon to do its own + # protection and cleanup. # - # N.B.: The generated must exactly match the rule generated for - # the "rem" command below! + # N.B.: The rule generated here must exactly match the + # corresponding rule generated for the "rem" command below! # echo block in log quick $proto \ from $addr/$mask to any $flags group $2 | \ @@ -167,7 +171,10 @@ add) ;; rem) case "$pf" in - ipf) + ipfilter) + # N.B.: The rule generated here must exactly match the + # corresponding rule generated for the "add" command above! + # echo block in log quick $proto \ from $addr/$mask to any $flags group $2 | \ /sbin/ipf -A -r -f - >/dev/null 2>&1 && echo OK @@ -200,19 +207,36 @@ rem) ;; flush) case "$pf" in - ipf) - # - # XXX this is a slightly convoluted way to remove all the rules - # in the group added for "$2" (i.e. normally by default - # "blocklistd"). + ipfilter) # # N.B. WARNING: This is obviously not reentrant! # + # First we flush all the rules from the inactive set, then we + # reload the ones that do not belong to the group "$2", and + # finally we swap the active and inactive rule sets. + # /sbin/ipf -I -F a + # + # "ipf -I -F a" also flushes active accounting rules! + # + # Note that accounting rule groups are unique to accounting + # rules and have nothing to do with filter rules, though of + # course theoretically one could use the same group name for + # them too. + # + # In theory anyone using any such accounting rules should have a + # wrapper /etc/rc.conf.d/blocklistd script (and corresponding + # /etc/rc.conf.d/ipfilter script) that will record and + # consolidate the values accumulated by such accounting rules + # before they are flushed, since otherwise their counts will be + # lost forever. + # /usr/sbin/ipfstat -io | fgrep -v "group $2" | \ /sbin/ipf -I -f - >/dev/null 2>&1 - # XXX this MUST be done last and separately as "-s" is executed + # + # This MUST be done last and separately as "-s" is executed # _while_ the command arguments are being processed! + # /sbin/ipf -s && echo OK ;;