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