proftpd: add netacl, logfmt, ftpaccess, and cmd fuzz harnesses#56
Open
tc-agent wants to merge 2 commits into
Open
proftpd: add netacl, logfmt, ftpaccess, and cmd fuzz harnesses#56tc-agent wants to merge 2 commits into
tc-agent wants to merge 2 commits into
Conversation
Fuzzing Coverage ReportTested: project
Per-harness
Δ = (after − before) / before, to accommodate that denominators may change. "new" when before is 0; "deleted" when after is 0. |
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 10, 2026 16:54
776e149 to
cd8ff90
Compare
tc-agent
force-pushed
the
master
branch
12 times, most recently
from
May 11, 2026 19:26
c6c45b4 to
c053f96
Compare
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 11, 2026 19:26
cd8ff90 to
7b77012
Compare
tc-agent
force-pushed
the
master
branch
13 times, most recently
from
May 16, 2026 13:03
d25286d to
ed731ba
Compare
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 16, 2026 15:47
7b77012 to
078c81f
Compare
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 16, 2026 16:51
078c81f to
9016991
Compare
tc-agent
force-pushed
the
master
branch
6 times, most recently
from
May 21, 2026 13:42
9a36aa8 to
6a4a93d
Compare
tc-agent
force-pushed
the
master
branch
3 times, most recently
from
May 27, 2026 06:33
6125235 to
e512e7e
Compare
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 27, 2026 07:53
9016991 to
019b947
Compare
tc-agent
force-pushed
the
master
branch
5 times, most recently
from
May 27, 2026 16:16
b5fd10c to
712a52f
Compare
tc-agent
force-pushed
the
update-proftpd-fuzzing
branch
from
May 28, 2026 01:02
019b947 to
a8cf930
Compare
tc-agent
force-pushed
the
master
branch
2 times, most recently
from
May 28, 2026 02:55
a7587cd to
b952f62
Compare
tc-agent
force-pushed
the
master
branch
4 times, most recently
from
May 28, 2026 18:05
af7f9a7 to
806b281
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds four libFuzzer harnesses alongside the existing bundled
json_fuzzer, targeting attacker-influenced inputs across proftpd's parsing surface.What is fuzzed
netacl_fuzzer— drivespr_netacl_create()over ACL strings (ALL,none, IPv4/IPv6 literals, CIDR, netmask, glob, DNS suffix, negation). These flow through<Allow>/<Deny>directives and represent the parsed form of operator-supplied access rules.logfmt_fuzzer— drivespr_jot_parse_logfmt()pluspr_jot_filters_create()across all three filter types (COMMANDS_WITH_CLASSES,COMMANDS,CLASSES) forLogFormat/ jot filter strings.ftpaccess_fuzzer— runspr_parser_parse_file()withPR_PARSER_FL_DYNAMIC_CONFIG, the flag proftpd uses for.ftpaccessfiles. Those are per-directory configuration drops that can land in user-writable directories, which is the attacker-influenced parser entry point. Static modules are registered viamodules_init()so each directive dispatches into the conftab handlers of mod_core, mod_auth, mod_xfer, mod_ls, mod_log, mod_delay, mod_ctrls etc.cmd_fuzzer— tokenizes the input into acmd_recand runs the command-recognition path:pr_cmd_get_id,pr_cmd_is_http/smtp/ssh2,pr_cmd_get_displayable_str, andpr_cmd_cmpagainst every FTP verb id. This is the pre-auth slice every connected client reaches; it does not callpr_cmd_dispatch_phasebecause that path reaches for response queues / scoreboard / proctitle / per-handler auth state that can't be faithfully stubbed without re-implementingfork_server.All harnesses follow the existing
json_fuzzerbuild pattern (reusingfuzz_lib.a,src/scoreboard.o,lib/prbase.a).Coverage
Per Fuzz Introspector, the existing single
json_fuzzercovers 1.30% of project lines (769 / 58945).After 5 minutes of concurrent fuzzing across all five harnesses (a 300s libFuzzer run per harness over the seed corpora below):
fuzzer(json): 769 / 58945 = 1.3%netacl_fuzzer: 1076 / 58943 = 1.8%logfmt_fuzzer: 895 / 58957 = 1.5%ftpaccess_fuzzer: 5863 / 58951 = 9.9%cmd_fuzzer: 914 / 59008 = 1.5%The 12.6% global is a 5-minute local measurement; the prior-state 1.30% baseline is sourced from Fuzz Introspector at the link above. The per-file figures below are also from the same local 5-minute run.
proftpd/modules/mod_core.c: 18.2% (896 / 4920)proftpd/modules/mod_xfer.c: 8.6%proftpd/modules/mod_auth.c: 8.5%src/jot.c: 25.2%src/netaddr.c: 22.0%src/netacl.c: 54.8%src/parser.c: 46.8%src/configdb.c: 31.2%src/stash.c: 52.2%Seeds
All seed corpora are human-readable text files (no binaries):
netacl_seeds/: nine ACL literals (CIDR, netmask, glob, IPv6, DNS).logfmt_seeds/: short-var, long-var, env/note/var, comma-separated commands, pipe-separated classes.ftpaccess_seeds/: eighteen layered configurations covering<Anonymous>,<Directory>,<Limit>,<Class>,<Global>,<VirtualHost>,<IfModule>, plus auth/logfmt/RLimit/regex/nested-block examples.cmd_seeds/: pre-auth FTP commands with arguments (USER anonymous,PORT 192,168,1,1,4,5,EPRT |1|...|,LIST -la /tmp,SITE CHMOD 0755 file,AUTH TLS, etc.), plusHTTP/SMTP/SSHbanners to exercise the protocol-sniffing branch.A libFuzzer dictionary (
ftpaccess_fuzzer.dict) lists every directive name extracted from the modules' conftabs and the eight section markers, to help mutations stay near the grammar.