351 lines
14 KiB
Plaintext
351 lines
14 KiB
Plaintext
A REPORT ON THE INTERNET WORM
|
||
Bob Page
|
||
University of Lowell
|
||
Computer Science Department
|
||
November 7, 1988
|
||
|
||
|
||
[Because of the many misquotes the media have been
|
||
giving, this report is Copyright (c) Bob Page, all
|
||
rights reserved. Permission is granted to republish
|
||
this ONLY if you republish it in its entirety.]
|
||
|
||
Here's the scoop on the "Internet Worm". Actually it's
|
||
not a virus - a virus is a piece of code that adds
|
||
itself to other programs, including operating systems.
|
||
It cannot run independently, but rather requires that
|
||
its "host" program be run to activate it. As such, it
|
||
has a clear analog to biologic viruses -- those viruses
|
||
are not considered live, but they invade host cells and
|
||
take them over, making them produce new viruses.
|
||
|
||
A worm is a program that can run by itself and can
|
||
propagate a fully working version of itself to other
|
||
machines. As such, what was loosed on the Internet was
|
||
clearly a worm.
|
||
|
||
This data was collected through an emergency mailing
|
||
list set up by Gene Spafford at Purdue University, for
|
||
administrators of major Internet sites - some of the
|
||
text is included verbatim from that list. Mail was
|
||
heavy since the formation of the list; it continues to
|
||
be on Monday afternoon - I get at least 2-3 messages
|
||
every hour. It's possible that some of this information
|
||
is incomplete, but I thought you'd like to know what I
|
||
know so far.
|
||
|
||
The basic object of the worm is to get a shell on
|
||
another machine so it can reproduce further. There are
|
||
three ways it attacks: sendmail, fingerd, and
|
||
rsh/rexec.
|
||
|
||
THE SENDMAIL ATTACK:
|
||
|
||
In the sendmail attack, the worm opens a TCP connection
|
||
to another machine's sendmail (the SMTP port), invokes
|
||
debug mode, and sends a RCPT TO that requests its data
|
||
be piped through a shell. That data, a shell script
|
||
(first-stage bootstrap) creates a temporary
|
||
second-stage bootstrap file called x$$,l1.c (where '$$'
|
||
is the current process ID). This is a small (40-line) C
|
||
program.
|
||
|
||
The first-stage bootstrap compiles this program with
|
||
the local cc and executes it with arguments giving the
|
||
Internet hostid/socket/password of where it just came
|
||
from. The second-stage bootstrap (the compiled C
|
||
program) sucks over two object files, x$$,vax.o and
|
||
x$$,sun3.o from the attacking host. It has an array for
|
||
20 file names (presumably for 20 different machines),
|
||
but only two (vax and sun) were compiled in to this
|
||
code. It then figures out whether it's running under
|
||
BSD or SunOS and links the appropriate file against the
|
||
C library to produce an executable program called
|
||
/usr/tmp/sh - so it looks like the Bourne shell to
|
||
anyone who looked there.
|
||
|
||
THE FINGERD ATTACK:
|
||
|
||
In the fingerd attack, it tries to infiltrate systems
|
||
via a bug in fingerd, the finger daemon. Apparently
|
||
this is where most of its success was (not in sendmail,
|
||
as was originally reported). When fingerd is connected
|
||
to, it reads its arguments from a pipe, but doesn't
|
||
limit how much it reads. If it reads more than the
|
||
internal 512-byte buffer allowed, it writes past the
|
||
end of its stack. After the stack is a command to be
|
||
executed ("/usr/ucb/finger") that actually does the
|
||
work. On a VAX, the worm knew how much further from the
|
||
stack it had to clobber to get to this command, which
|
||
it replaced with the command "/bin/sh" (the bourne
|
||
shell). So instead of the finger command being
|
||
executed, a shell was started with no arguments. Since
|
||
this is run in the context of the finger daemon, stdin
|
||
and stdout are connected to the network socket, and all
|
||
the files were sucked over just like the shell that
|
||
sendmail provided.
|
||
|
||
THE RSH/REXEC ATTACK:
|
||
|
||
The third way it tried to get into systems was via the
|
||
.rhosts and /etc/hosts.equiv files to determine
|
||
'trusted' hosts where it might be able to migrate to.
|
||
To use the .rhosts feature, it needed to actually get
|
||
into people's accounts - since the worm was not running
|
||
as root (it was running as daemon) it had to figure out
|
||
people's passwords. To do this, it went through the
|
||
/etc/passwd file, trying to guess passwords. It tried
|
||
combinations of: the username, the last, first,
|
||
last+first, nick names (from the GECOS field), and a
|
||
list of special "popular" passwords:
|
||
|
||
|
||
|
||
aaa cornelius guntis noxious simon
|
||
academia couscous hacker nutrition simple
|
||
aerobics creation hamlet nyquist singer
|
||
airplane creosote handily oceanography single
|
||
albany cretin happening ocelot smile
|
||
albatross daemon harmony olivetti smiles
|
||
albert dancer harold olivia smooch alex
|
||
daniel harvey oracle smother alexander
|
||
danny hebrides orca snatch algebra dave
|
||
heinlein orwell snoopy aliases december
|
||
hello osiris soap alphabet defoe help
|
||
outlaw socrates ama deluge herbert oxford
|
||
sossina amorphous desperate hiawatha pacific
|
||
sparrows analog develop hibernia painless spit
|
||
anchor dieter honey pakistan spring
|
||
andromache digital horse pam springer
|
||
animals discovery horus papers squires
|
||
answer disney hutchins password strangle
|
||
anthropogenic dog imbroglio patricia stratford
|
||
anvils drought imperial penguin stuttgart
|
||
anything duncan include peoria subway aria
|
||
eager ingres percolate success ariadne
|
||
easier inna persimmon summer arrow edges
|
||
innocuous persona super arthur edinburgh
|
||
irishman pete superstage athena edwin isis
|
||
peter support atmosphere edwina japan
|
||
philip supported aztecs egghead jessica
|
||
phoenix surfer azure eiderdown jester
|
||
pierre suzanne bacchus eileen jixian
|
||
pizza swearer bailey einstein johnny
|
||
plover symmetry banana elephant joseph
|
||
plymouth tangerine bananas elizabeth joshua
|
||
polynomial tape bandit ellen judith
|
||
pondering target banks emerald juggle pork
|
||
tarragon barber engine julia poster
|
||
taylor baritone engineer kathleen praise
|
||
telephone bass enterprise kermit precious
|
||
temptation bassoon enzyme kernel prelude
|
||
thailand batman ersatz kirkland prince
|
||
tiger beater establish knight princeton
|
||
toggle beauty estate ladle protect
|
||
tomato beethoven euclid lambda protozoa
|
||
topography beloved evelyn lamination
|
||
pumpkin tortoise benz extension larkin puneet
|
||
toyota beowulf fairway larry puppet
|
||
trails berkeley felicia lazarus rabbit
|
||
trivial berliner fender lebesgue rachmaninoff
|
||
trombone beryl fermat lee rainbow tubas
|
||
beverly fidelity leland raindrop tuttle
|
||
bicameral finite leroy raleigh umesh bob
|
||
fishers lewis random unhappy brenda
|
||
flakes light rascal unicorn brian
|
||
float lisa really unknown bridget flower
|
||
louis rebecca urchin broadway flowers
|
||
lynne remote utility bumbling foolproof
|
||
macintosh rick vasant burgess football mack
|
||
ripple vertigo campanile foresight maggot
|
||
robotics vicky cantor format magic
|
||
rochester village cardinal forsythe malcolm
|
||
rolex virginia carmen fourier mark romano
|
||
warren carolina fred markus ronald water
|
||
caroline friend marty rosebud weenie
|
||
cascades frighten marvin rosemary whatnot
|
||
castle fun master roses whiting cat
|
||
fungible maurice ruben whitney cayuga
|
||
gabriel mellon rules will celtics gardner
|
||
merlin ruth william cerulean garfield mets sal
|
||
williamsburg change gauss michael saxon
|
||
willie charles george michelle scamper
|
||
winston charming gertrude mike scheme wisconsin
|
||
charon ginger minimum scott wizard
|
||
chester glacier minsky scotty wombat
|
||
cigar gnu moguls secret
|
||
|
||
woodwind classic golfer moose sensor
|
||
wormwood clusters gorgeous morley serenity yaco
|
||
coffee gorges mozart sharks yang coke
|
||
gosling nancy sharon yellowstone collins
|
||
gouge napoleon sheffield yosemite commrades
|
||
graham nepenthe sheldon zap computer gryphon
|
||
ness shiva zimmerman condo guest network
|
||
shivers cookie guitar newton shuttle
|
||
cooper gumption next signature
|
||
|
||
|
||
|
||
[I wouldn't have picked some of these as "popular"
|
||
passwords, but then again, I'm not a worm writer. What
|
||
do I know?]
|
||
|
||
When everything else fails, it opens /usr/dict/words
|
||
and tries every word in the dictionary. It is pretty
|
||
successful in finding passwords, as most people don't
|
||
choose them very well. Once it gets into someone's
|
||
account, it looks for a .rhosts file and does an 'rsh'
|
||
and/or 'rexec' to another host, it sucks over the
|
||
necessary files into /usr/tmp and runs /usr/tmp/sh to
|
||
start all over again.
|
||
|
||
Between these three methods of attack (sendmail,
|
||
fingerd, .rhosts) it was able to spread very quickly.
|
||
|
||
THE WORM ITSELF:
|
||
|
||
The 'sh' program is the actual worm. When it starts up
|
||
it clobbers its argv array so a 'ps' will not show its
|
||
name. It opens all its necessary files, then unlinks
|
||
(deletes) them so they can't be found (since it has
|
||
them open, however, it can still access the contents).
|
||
It then tries to infect as many other hosts as possible
|
||
- when it sucessfully connects to one host, it forks a
|
||
child to continue the infection while the parent keeps
|
||
on trying new hosts.
|
||
|
||
One of the things it does before it attacks a host is
|
||
connect to the telnet port and immediately close it.
|
||
Thus, "telnetd: ttloop: peer died" in /usr/adm/messages
|
||
means the worm attempted an attack.
|
||
|
||
The worm's role in life is to reproduce - nothing more.
|
||
To do that it needs to find other hosts. It does a
|
||
'netstat -r -n' to find local routes to other hosts &
|
||
networks, looks in /etc/hosts, and uses the yellow
|
||
pages distributed hosts file if it's available. Any
|
||
time it finds a host, it tries to infect it through one
|
||
of the three methods, see above. Once it finds a local
|
||
network (like 129.63.nn.nn for ulowell) it sequentially
|
||
tries every address in that range.
|
||
|
||
If the system crashes or is rebooted, most system boot
|
||
procedures clear /tmp and /usr/tmp as a matter of
|
||
course, erasing any evidence. However, sendmail log
|
||
files show mail coming in from user /dev/null for user
|
||
/bin/sed, which is a tipoff that the worm entered.
|
||
|
||
Each time the worm is started, there is a 1/15 chance
|
||
(it calls random()) that it sends a single byte to
|
||
ernie.berkeley.edu on some magic port, apparently to
|
||
act as some kind of monitoring mechanism.
|
||
|
||
THE CRACKDOWN:
|
||
|
||
Three main 'swat' teams from Berkeley, MIT and Purdue
|
||
found copies of the VAX code (the .o files had all the
|
||
symbols intact with somewhat meaningful names) and
|
||
disassembled it into about 3000 lines of C. The BSD
|
||
development team poked fun at the code, even going so
|
||
far to point out bugs in the code and supplying source
|
||
patches for it! They have not released the actual
|
||
source code, however, and refuse to do so. That could
|
||
change - there are a number of people who want to see
|
||
the code.
|
||
|
||
Portions of the code appear incomplete, as if the
|
||
program development was not yet finished. For example,
|
||
it knows the offset needed to break the BSD fingerd,
|
||
but doesn't know the correct offset for Sun's fingerd
|
||
(which causes it to dump core); it also doesn't erase
|
||
its tracks as cleverly as it might; and so on.
|
||
|
||
The worm uses a variable called 'pleasequit' but
|
||
doesn't correctly initialize it, so some folks added a
|
||
module called _worm.o to the C library, which is
|
||
produced from: int pleasequit = -1; the fact that this
|
||
value is set to -1 will cause it to exit after one
|
||
iteration.
|
||
|
||
The close scrutiny of the code also turned up comments
|
||
on the programmer's style. Verbatim from someone at
|
||
MIT: From disassembling the code, it looks like the
|
||
programmer is really anally retentive about checking
|
||
return codes, and, in addition, prefers to use array
|
||
indexing instead of pointers to walk through arrays.
|
||
|
||
Anyone who looks at the binary will not see any
|
||
embedded strings - they are XOR'ed with 81 (hex).
|
||
That's how the shell commands are imbedded. The
|
||
"obvious" passwords are stored with their high bit set.
|
||
|
||
|
||
Although it spreads very fast, it is somewhat slowed
|
||
down by the fact that it drives the load average up on
|
||
the machine - this is due to all the encryptions going
|
||
on, and the large number of incoming worms from other
|
||
machines.
|
||
|
||
[Initially, the fastest defense against the worm is is
|
||
to create a directory called /usr/tmp/sh. The script
|
||
that creates /usr/tmp/sh from one of the .o files
|
||
checks to see if /usr/tmp/sh exists, but not to see if
|
||
it's a directory. This fix is known as 'the condom'.]
|
||
|
||
NOW WHAT?
|
||
|
||
None of the ULowell machines were hit by the worm. When
|
||
BBN staffers found their systems infected, they cut
|
||
themselves off from all other hosts. Since our
|
||
connection to the Internet is through BBN, we were cut
|
||
off as well. Before we were cut off, I received mail
|
||
about the sendmail problem and installed a patch to
|
||
disable the feature the worm uses to get in through
|
||
sendmail. I had made local modifications to fingerd
|
||
which changed the offsets, so any attempt to scribble
|
||
over the stack would probably have ended up in a core
|
||
dump.
|
||
|
||
Most Internet systems running 4.3BSD or SunOS have
|
||
installed the necessary patches to close the holes and
|
||
have rejoined the Internet. As you would expect, there
|
||
is a renewed interest in system/network security,
|
||
finding and plugging holes, and speculation over what
|
||
will happen to the worm's creator.
|
||
|
||
If you haven't read or watched the news, various log
|
||
files have named the responsible person as Robert
|
||
Morris Jr., a 23-year old doctoral student at Cornell.
|
||
His father is head of the National Computer Security
|
||
Center, the NSA's public effort in computer security,
|
||
and has lectured widely on security aspects of UNIX.
|
||
|
||
Associates of the student claim the worm was a
|
||
'mistake' - that he intended to unleash it but it was
|
||
not supposed to move so quickly or spread so much. His
|
||
goal (from what I understand) was to have a program
|
||
'live' within the Internet. If the reports that he
|
||
intended it to spread slowly are true, then it's
|
||
possible that the bytes sent to ernie.berkeley.edu were
|
||
intended to monitor the spread of the worm. Some news
|
||
reports mentioned that he panicked when, via some
|
||
"monitoring mechanism" he saw how fast it had
|
||
propagated.
|
||
|
||
A source inside DEC reports that although the worm
|
||
didn't make much progress there, it was sighted on
|
||
several machines that wouldn't be on its normal
|
||
propagation path, i.e. not gateways and not on the same
|
||
subnet. These machines are not reachable from the
|
||
outside. Morris was a summer intern at DEC in '87. He
|
||
might have included names or addresses he remembered as
|
||
targets for infesting hidden internal networks. Most of
|
||
the DEC machines in question belong to the group he
|
||
worked in.
|
||
|
||
The final word has not been written - I don't think the
|
||
FBI have even met with this guy yet. It will be
|
||
interesting to see what happens.
|
||
|
||
|