Bug#1144169: nec2c: stack buffer overflow reading a card line longer than 81 characters
Hibby <[email protected]>
| Newsgroups | gmane.linux.debian.devel.ham |
|---|---|
| Message-ID | <2028bfbc-d264-4027-b784-d59bd69aa135__36800.3110562981$1786699650$gmane$org@app.fastmail.com> |
Thanks, I'll get on this later! -- Dave Hibberd <[email protected]> Debian Developer Packet Radioist MM0RFN On Tue, 11 Aug 2026, at 11:04 PM, ch wrote: > Package: nec2c > Version: 1.3.1-3 > Severity: important > Tags: upstream security > > main() reads deck lines into an 81-byte buffer, while load_line() fills a > caller's buffer with up to LINE_LEN (132) characters plus a terminator: > > main.c:41 char ain[3], line_buf[81]; > nec2c.h:81 #define LINE_LEN 132 > misc.c while( num_chr < LINE_LEN ) { buff[num_chr++] = (char)chr; ... } > buff[num_chr] = '\0'; > > A card line longer than 81 characters therefore overflows line_buf by up to 52 > bytes. A NEC-2 comment card is 80 columns plus its "CM ", so ordinary input > reaches it; no malformed or hostile deck is required. > > Reproducer -- a deck whose second CM card is 100 characters. It must not be > the first line, which is read on a different path: > > { > echo "CM first" > echo "CM $(printf 'A%.0s' {1..100})" > echo "CE" > echo "GW 1 9 0 0 0 0 0 1 0.001" > echo "GE 0" > echo "EK" > echo "EX 0 1 5 0 1.0 0.0" > echo "FR 0 1 0 0 145.9 0" > echo "RP 0 3 1 1000 0 0 30 0" > echo "EN" > } > t.nec > nec2c -i t.nec -o t.out > > Built from the 1.3.1-3 source with gcc -O0 -g -fsanitize=address: > > ERROR: AddressSanitizer: stack-buffer-overflow > WRITE of size 1 > #0 load_line misc.c:154 > #1 main main.c:269 > [1920, 2001) 'line_buf' (line 41) <== Memory access at offset 2001 > overflows this variable > > The packaged binary usually does not crash, because main()'s infile[81] and > otfile[81] are adjacent to line_buf and absorb the overrun rather than the > stack canary. That makes it quiet, not harmless: it is an out-of-bounds write > whose length is controlled by the input file. > > Severity: this is a local command-line tool reading a file the user chose, so > I have not filed it as a security issue. It would deserve one for any workflow > that feeds it decks from an untrusted source. > > Upstream status: upstream git (https://github.com/KJ7LNW/nec2c) widened the > buffer to LINE_LEN in 3d8c230, before tagging v1.3.1. That reduces the > overflow to a single byte but does not remove it -- load_line() still writes > buff[LINE_LEN] into a char[LINE_LEN] -- and I have reported that separately. > There is therefore no released upstream version to upgrade to yet. > > Suggested fix, which is sufficient on its own against the 1.3.1-3 source: > > --- a/main.c > +++ b/main.c > @@ > - char ain[3], line_buf[81]; > + char ain[3], line_buf[LINE_LEN+1]; > > With that applied, ASan is clean on the reproducer and an over-long line is > rejected rather than corrupting memory.