Please consider a donation to the Higher Intellect project. See or the Donate to Higher Intellect page for more info.


From Higher Intellect Vintage Wiki
Jump to navigation Jump to search
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


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

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. 


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 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 '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 on some magic port, apparently to
act as some kind of monitoring mechanism. 


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

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

[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'.] 


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

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 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

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.