
Security problems in Linberto versions < 1.0.2:
-----------------------------------------------

Here's the problem:

---------------------------- screen.c: ----------------------------

 sprintf( fileraw, "%s/linbertoss%04d.raw", LINBERTO_SCREENSDIR, count);

 while( access( fileraw, W_OK) != -1) {
        count++;
        sprintf( fileraw, "%s/linbertoss%04d.raw", LINBERTO_SCREENSDIR, count);
 }

-------------------------------------------------------------------

When you make a screen shot with F1, my program checks for
/tmp/linbertoss????.raw but not for /tmp/linbertoss????.pal

So, a malicious user could make a link and overwrite any file.

And, of course, this version of Linberto is fixed :).


I wish to thank:

 * Eziman (eziman@ussrback.com), he surprised me with a phone call the same
   day the bug appeared in Packet Storm (http://www.securify.com/packetstorm/).
 * Grampa Elite <grandpa@nconnect.net>, the one that made the security
   advisory, found the bug, mailed me, etc...
 * To all the people who flooded me about this bug... :)



The original security advisory:

----------------------------------------------------------------------------

Vulnerability: Any user can overwrite any file in the system.
title=Linberto v1.0.2 (Q-Bert clone)
author=diego@grigna.com (Diego Javier Grigna)
system=Linux, svgalib
foundby=grampae@netwurx.net (Grampa Elite)

Overview: 	Linberto under default installation creates screenshots under 
the /tmp directory when the user presses F1.  Take a look at this snippet from 
the installation docs.
-------------------------------begin-screenshot.txt----------------------------
When you press F1 anywhere when running the game, a screen shot
of the current screen will be saved to the directory LINBERTO_SCREENSDIR
which is (by default in the Makefile) /tmp/.

The program makes two files:

LINBERTO_SCREENSDIR/linbertossXXXX.raw  ---> Which contains the image data
                                             (the byte of each pixel).

and

LINBERTO_SCREENSDIR/linbertossXXXX.pal  ---> Which contains the palette in
                                             the format:
                                             "Color index, Red, Green, Blue\n"


The "XXXX" in the filename is a number from 0000 to 9999. Each time a
screen shot is made, the program will try to use the lowest possible
number (0000 by default) if that file exists that number will be incre-
mented by one, until a non existing filename is found.
-------------------------------end-screenshot.txt------------------------------
	
The problem is that it does not check to see if the file linbertossXXXX.pal
is currently there as Diego says it does, and follows symlinks. Linberto is not 
root suid which actually does not matter, since this is a console game for X 
that installs executable only by root. 
So as an example we would do a "ln -s /etc/passwd /tmp/linbertoss0000.pal"
or any other file you would like to overwrite, and wait for root to play 
linberto and take a screen capture.  If the linbertossXXXX.pal and .raw
files are already in /tmp, just use the next number.

----------------------------------------------------------------------


