281 lines
13 KiB
Plaintext
281 lines
13 KiB
Plaintext
|
From: jmolini@nasamail.nasa.gov (JAMES E. MOLINI)
|
|||
|
Date: Wed, 4 Apr 90 14:03 PDT
|
|||
|
Message-Id: <LJJA-2875-5674@nasamail>
|
|||
|
To: virus-l@ibm1.cc.lehigh.edu
|
|||
|
Cc: rdavis@nasamail.nasa.gov, lsnapp@nasamail.nasa.gov
|
|||
|
Subject: Universal Virus Detector?
|
|||
|
X-Lines: 272
|
|||
|
|
|||
|
I am working with a colleague on defining a robust virus detection
|
|||
|
utility. The paper below discusses an approach we are investigating.
|
|||
|
The work was undertaken as part of a research project sponsored by the
|
|||
|
National Aeronautics and Space Administration at the Johnson Space Center.
|
|||
|
|
|||
|
Please look it over and tell us what you think. We would like to know what
|
|||
|
type of virus could be written to defeat this type of detector on a large
|
|||
|
scale. I know it is a rather long document, but you might find it
|
|||
|
interesting. Thanks in advance.
|
|||
|
|
|||
|
A Universal Virus Detection Model
|
|||
|
|
|||
|
|
|||
|
by Chris Ruhl and James Molini
|
|||
|
Computer Sciences Corp.
|
|||
|
Email: jmolini@nasamail.arc.nasa.gov
|
|||
|
|
|||
|
PREFACE
|
|||
|
|
|||
|
This paper attempts to define an abstract model which will support the
|
|||
|
construction of a Universal Virus Detector. Although the restrictions
|
|||
|
imposed upon the model for 100% accuracy may be too severe to make such
|
|||
|
an implementation practical, it is quite feasible to achieve near
|
|||
|
universal virus detection in a user friendly fashion.
|
|||
|
|
|||
|
This paper is distributed with the intent of discovering reasonable
|
|||
|
vulnerabilities in the concepts, or implementation. Comments are
|
|||
|
therefore encouraged. We have used an IBM PC Compatible running MS DOS
|
|||
|
3.X as the candidate implementation platform for convenience.
|
|||
|
|
|||
|
The paper does not discuss virus identification, which is a separate
|
|||
|
issue from detection. Although not "absolutely necessary," virus
|
|||
|
identification mechanisms dramatically reduce the time required to
|
|||
|
eradicate specific cases of virus infection.
|
|||
|
|
|||
|
If you have questions, or see a flaw in the process, please let us
|
|||
|
know. We are building a virus detector, which could be placed into the
|
|||
|
public domain, that uses the techniques below to detect virus
|
|||
|
infections. Our initial tests have shown encouraging results.
|
|||
|
|
|||
|
Please send comments/suggestions to Virus-L, or the authors at the
|
|||
|
Email address above. Please do not request code samples, or testing
|
|||
|
opportunities until we announce availability of the utility.
|
|||
|
|
|||
|
Definitions
|
|||
|
|
|||
|
Before proceeding with our discussion, it is important to define
|
|||
|
terms. The following definitions are taken (as faithfully as possible)
|
|||
|
from the most recent discussions about viruses on the various Email
|
|||
|
networks:
|
|||
|
|
|||
|
VIRUS - A self-replicating program that must attach itself in some way
|
|||
|
to an existing executable on the target computer system in order to
|
|||
|
propagate. In doing so, no overt user action is required to further
|
|||
|
the replication process.
|
|||
|
|
|||
|
TROJAN HORSE - A non-replicating malicious program that misleads the
|
|||
|
user in order to cause him/her to execute it's malicious code.
|
|||
|
Although it is malicious code, it is often hidden inside another piece
|
|||
|
of (apparently innocuous) code in order to escape detection. This type
|
|||
|
of program does not modify any existing executable files on the system.
|
|||
|
|
|||
|
WORM - A self-replicating program that does not attach itself to other
|
|||
|
executable code in order to propagate. It relies upon some weakness in
|
|||
|
a multi-user system, or requires some sort of overt user action in
|
|||
|
order to operate. The technical feasibility of worms on single user
|
|||
|
computer systems is debatable.
|
|||
|
|
|||
|
INFECTION - The act of modifying existing executable code in order to
|
|||
|
propagate a virus.
|
|||
|
|
|||
|
MASKING - The act of preventing discovery by intervening at some point
|
|||
|
in the scanning process. Typically this effects an indication of a
|
|||
|
clean system, when, in fact, the environment under review has been
|
|||
|
modified.
|
|||
|
|
|||
|
Understanding the scope of the virus problem, it is possible to define
|
|||
|
a circumstance in which a Universal Virus Detector (UVD) may be
|
|||
|
successful. We further scope the problem by NOT requiring that the UVD
|
|||
|
prevent an infection. Instead it can identify an infection after it
|
|||
|
has occurred. This principle is similar to the idea that smoke
|
|||
|
detectors are not responsible for preventing fires, although they may
|
|||
|
periodically work toward that end. They are actually responsible only
|
|||
|
for responding to indications that a fire may be present and warning
|
|||
|
the user of impending danger. UVD's must be scoped to a similar
|
|||
|
purpose for them to work.
|
|||
|
|
|||
|
With this in mind, let us begin by defining the physic of computer
|
|||
|
viruses:
|
|||
|
|
|||
|
|
|||
|
A Virus Propagation Model
|
|||
|
|
|||
|
|
|||
|
Although a Virus is an abstraction (i.e. Program), the environment
|
|||
|
it attacks is not (i.e. IBM PC). Regardless of how creative the author
|
|||
|
is, he/she cannot change certain characteristics of the machine that
|
|||
|
the Virus inhabits. In order to develop this model the following
|
|||
|
assumptions are made:
|
|||
|
|
|||
|
a.) The user will begin the detection process (we have proposed a
|
|||
|
CRC type routine) prior to infection. By doing so, the user
|
|||
|
has provided an uninfected baseline from which to judge future
|
|||
|
states. Although virus propagation may still be identifiable
|
|||
|
on an infected machine, the level of detection for subsequent
|
|||
|
states becomes indeterminate.
|
|||
|
|
|||
|
b.) The user will avoid the introduction of self modifying code
|
|||
|
into the system. By doing so, he/she ensures that the target
|
|||
|
system maintains a given state of integrity.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Given the assumptions above, we may now define the circumstances
|
|||
|
necessary to support a virus infection. Without the adherence to the
|
|||
|
following rules, it is impossible to define a circumstance in which a
|
|||
|
virus can propagate.
|
|||
|
|
|||
|
Rule #1: A Virus infection, or propagation occurs when an
|
|||
|
executable file is altered.
|
|||
|
Proof:
|
|||
|
I) An un-altered executable will not be infected since by
|
|||
|
definition it is not altered. Here we are assuming that the
|
|||
|
original state of the machine is uninfected.
|
|||
|
|
|||
|
II) An unaltered piece of code that performs malicious acts is a
|
|||
|
Trojan horse and thus, beyond the scope of this problem.
|
|||
|
|
|||
|
III) A non-executable file, whether altered, or not, cannot
|
|||
|
further infect the system since by definition it is never
|
|||
|
executed. An altered non-executable is merely a damaged data
|
|||
|
file.
|
|||
|
|
|||
|
Thus: Only altered executables can further infect the system.
|
|||
|
|
|||
|
Note: In certain cases, a new executable file can be added to the
|
|||
|
system, but it still cannot infect the system, unless it is
|
|||
|
called from a modified file in the system, (violating I
|
|||
|
above) or unless the user intervenes, in which case the
|
|||
|
program is not a virus, but a worm, or Trojan Horse.
|
|||
|
|
|||
|
Rule #2: Assuming that the detection mechanism is sufficiently
|
|||
|
robust, the only possible way to avoid detection is to
|
|||
|
mask the infection prior to having the detection results
|
|||
|
presented to the user.
|
|||
|
|
|||
|
Proof:
|
|||
|
I) An un-altered procedure cannot mask an infected file since
|
|||
|
by definition its not altered to do so. (Masking requires
|
|||
|
foreknowledge of the code to be masked. Such a masking
|
|||
|
scenario would indicate a state of infection prior to
|
|||
|
installation of the UVD violating a basic assumption that you
|
|||
|
install it on a clean machine.)
|
|||
|
|
|||
|
II) Masking requires some type of intervention in the file
|
|||
|
read/result presentation process. Here we assume that the
|
|||
|
computation of the checksum is sufficiently robust that no 2
|
|||
|
different pieces of code can generate the same result.
|
|||
|
Therefore, since masking requires some type of modification
|
|||
|
of data in the path from storage to user and since the only
|
|||
|
2 feasible parts to that path are either the read, or the
|
|||
|
delivery, any masking must be completed at one of the 2 ends
|
|||
|
of the pipe.
|
|||
|
|
|||
|
Thus: Only altered procedures can mask the infection of
|
|||
|
executables.
|
|||
|
|
|||
|
|
|||
|
UVD CONSTRUCTION.
|
|||
|
|
|||
|
>From the above discussion, we can begin defining a UVD with some degree
|
|||
|
of assurance that it will do the job. If a virus must modify the
|
|||
|
original state of the system in order to be successful, we can define a
|
|||
|
process that can detect that modification. (Insert your favorite
|
|||
|
Checksum/CRC/Cryptographic routine here.) Any program which
|
|||
|
circumvents the modification of existing code is not a virus.
|
|||
|
|
|||
|
Then, to defeat the detection process, the virus must mask the
|
|||
|
infection in some way so that this verifiable change detection
|
|||
|
mechanism cannot present accurate results to the user.
|
|||
|
|
|||
|
Any program which circumvents the detection mechanism must do so by
|
|||
|
modifying the data delivery process into, or out of the detector. Once
|
|||
|
again we are talking about code modification.
|
|||
|
|
|||
|
We have recently seen an example of the masking effect. In that case
|
|||
|
the 4096 virus, masked all infected files prior to releasing the data
|
|||
|
to any process attempting to read them. Another masking attack would
|
|||
|
redirect all detector output to NULL on a PC, thereby depriving the
|
|||
|
user of any notification that the detector may have generated.
|
|||
|
|
|||
|
Another option, which attempts to mask infections, is a directed attack
|
|||
|
against the utility. In order to prevent successful directed attacks,
|
|||
|
several methods can be used. The following methods attempt to validate
|
|||
|
the integrity of the detection code, or stored tables:
|
|||
|
|
|||
|
a. Run the detector from a write-protected, bootable floppy, thus
|
|||
|
assuring a validated run time environment and providing a constant
|
|||
|
set of scan pointers.
|
|||
|
|
|||
|
b. Use software to validate the detector prior to operation and
|
|||
|
validate the fact that the detector is operating with exclusive use
|
|||
|
of the CPU. Antigen is one example of code which validates the
|
|||
|
integrity of a program prior to execution.
|
|||
|
|
|||
|
c. Prevent modification of computer checksums by prefixing each file
|
|||
|
with a set of detector specific state vectors. This approach
|
|||
|
obtains a set of memory resident pointers, or values that are
|
|||
|
specific to the region where the detector is run. These pieces of
|
|||
|
information are then prepended to each executable checked and act
|
|||
|
as a type of "fingerprint" for the virus detector. They will
|
|||
|
change from machine to machine and from version to version. As a
|
|||
|
result, no virus can intercept the data points and compute a
|
|||
|
substitute checksum.
|
|||
|
|
|||
|
d. Finally, a simple way to hinder directed attacks in a general
|
|||
|
sense is to change file extensions, or stored text strings, which
|
|||
|
will make identification of the detector by directed viruses more
|
|||
|
difficult. Normally, this is only feasible when dealing with non-
|
|||
|
copyrighted programs.
|
|||
|
|
|||
|
So to put our theoretical UVD into practice, on, for example, an IBM
|
|||
|
PC, we would do the following:
|
|||
|
|
|||
|
a. Begin by validating the integrity of the detector code. This has
|
|||
|
been discussed above.
|
|||
|
|
|||
|
b. Validate the integrity of the read process by checking the
|
|||
|
interrupt table and low memory for changes. This would stop the
|
|||
|
4096 and viruses of its species, which place themselves in the
|
|||
|
memory resident read procedures and mask infections.
|
|||
|
|
|||
|
c. Validate the correctness of the output process by checking screen
|
|||
|
write interrupt vectors and device paths. It could be done also by
|
|||
|
generating a direct write procedure to hardware addresses during
|
|||
|
the installation process.
|
|||
|
|
|||
|
d. Validate the Boot sector of the disk and hidden R/O system files
|
|||
|
via direct sector reads. Knowing that the read process is
|
|||
|
unchanged, we can also be sure that the data coming into the CRC
|
|||
|
routine is correct. This then would defeat the Pakistani Brain and
|
|||
|
viruses of that sort. which relocate the boot sector and generate
|
|||
|
offset addresses.
|
|||
|
|
|||
|
e. Once both ends of the pipe and the pipe itself are validated, we
|
|||
|
can begin checking all executables on the system for modifications.
|
|||
|
|
|||
|
By doing this we have checked the entire data path and found it to be
|
|||
|
correct. We have also checked the correctness of the change detection
|
|||
|
procedure. This assumes that no other process has taken over the CPU
|
|||
|
during the scan, but this is no problem as long as we mask all external
|
|||
|
interrupts. Then only an actual hardware interrupt can cause the
|
|||
|
program to pause. And even these interrupts can be masked to a certain
|
|||
|
extent.
|
|||
|
|
|||
|
Some have said in the past that the human is also a part of this process.
|
|||
|
We agree, but the user must be a part of any process. This utility must be
|
|||
|
designed to present the user with a reliable estimation of the integrity of
|
|||
|
executable files in the target machine. Running the utility in conjunction
|
|||
|
with the software update process guarantees that the user is aware of
|
|||
|
changes to the system configuration. Doing this in a controlled fashion
|
|||
|
will not violate the integrity of the model.
|
|||
|
|
|||
|
Although the detection of authorized modifications may be a nuisance, it is
|
|||
|
necessary if we are to allow the system owner to make all risk related
|
|||
|
decisions on his/her system. If the user misses an infection once, it is
|
|||
|
fairly certain that the infection will be attempted again on the same
|
|||
|
machine (we saw over 400 infections on one machine). To this end, boot
|
|||
|
infections and memory infections are always flagged as serious. Beyond
|
|||
|
that, we can't effectively protect the user from himself.
|
|||
|
|
|||
|
|
|||
|
|