6729559 2001-07-09 23:32 -0600 /69 rader/ Charles Stevenson <core@ezlink.com> Sänt av: joel@lysator.liu.se Importerad: 2001-07-10 16:49 av Brevbäraren Extern mottagare: Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Extern kopiemottagare: Bugtraq <bugtraq@securityfocus.com> Extern kopiemottagare: Vuln-dev <vuln-dev@securityfocus.com> Mottagare: Bugtraq (import) <17887> Kommentar till text 6725236 av Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Ärende: Re: Tripwire temporary files ------------------------------------------------------------ From: Charles Stevenson <core@ezlink.com> To: Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Cc: Bugtraq <bugtraq@securityfocus.com>, Vuln-dev <vuln-dev@securityfocus.com> Message-ID: <3B4A936D.FF2DA075@ezlink.com> Jarno Huuskonen wrote: > After that I looked at the tripwire sources and confirmed the problem. > (See e.g. core/archive.cpp, core/unix/unixfsservices.cpp and > tw/textreportviewer.cpp). If you noticed a few more lines down the file get's removed. -> TSTRING& cUnixFSServices::MakeTempFilename( TSTRING& strName ) const throw(eFSServices) -> { -> ... -> // create temp filename -> pchTempFileName = mktemp( szTemplate ); -> ... -> strName = pchTempFileName; -> ... -> -> // Linux creates the file!! Doh! -> // So I'll always attempt to delete it -bam -> FileDelete( strName ); -> -> return( strName ); -> } So it's going to be a really tight race since the file would have to be created just after FileDelete is called. -> void cLockedTemporaryFileArchive::OpenReadWrite( const TCHAR* filename, uint32 openFlags ) -> { -> ... -> // if filename is NULL, create a temp file for the caller -> if( filename == NULL ) -> { -> try -> { -> iFSServices::GetInstance()->GetTempDirName( strTempFile ); -> strTempFile += _T("twtempXXXXXX"); -> iFSServices::GetInstance()->MakeTempFilename( strTempFile ); -> ... -> // open file -> mCurrentFilename = filename ? filename : strTempFile.c_str(); -> mCurrentFile.Open( mCurrentFilename, flags ); -> ... -> } I've been trying to think of a way to exploit this. The only way I could foresee was if you could run an exploit as a cron timed with a tripwire cron run as root and the exploit would create a lot of symlinks right before tripwire runs which could allow creation of files as root but if the file get's removed then really what you'd need is a way to watch all the symlinks you've created and the instant one is removed create it again (run on sentence;). Any ideas? The patch should be to use mkstemp() if the OS is Linux. Best Regards, Charles Stevenson (6729559) /Charles Stevenson <core@ezlink.com>/(Ombruten) 6729572 2001-07-10 11:13 +0200 /24 rader/ Paul Starzetz <paul@starzetz.de> Sänt av: joel@lysator.liu.se Importerad: 2001-07-10 16:53 av Brevbäraren Extern mottagare: Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Extern mottagare: bugtraq@securityfocus.com <bugtraq@securityfocus.com> Mottagare: Bugtraq (import) <17889> Kommentar till text 6725236 av Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Ärende: Re: Tripwire temporary files ------------------------------------------------------------ From: Paul Starzetz <paul@starzetz.de> To: Jarno Huuskonen <Jarno.Huuskonen@uku.fi>, "bugtraq@securityfocus.com" <bugtraq@securityfocus.com> Message-ID: <3B4AC732.1EE59E6E@starzetz.de> Jarno Huuskonen wrote: > I found out about the problem when I noticed a temporary file > /tmp/twtempa19212 left in /tmp. Out of curiosity I ran the tripwire > binary with strace and noticed that temporary files in /tmp are opened > without the O_EXCL flag. Here a strace from tripwire 1.2 (Source RPM: tripwire-1.2-223.src.rpm): open("/tmp/twznG1Eud", O_RDWR|O_CREAT|O_TRUNC, 0666) = 4 open("/tmp/twzd9tWqg", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 open("/tmp/twzzykpkj", O_RDWR|O_CREAT, 0600) = 4 nowhere the current pid is used - instead a 6 byte template appears, which is not really predictable (at least shouldn't be!). Ihq. (6729572) /Paul Starzetz <paul@starzetz.de>/(Ombruten) Kommentar i text 6729755 av Jarno Huuskonen <Jarno.Huuskonen@uku.fi> 6729755 2001-07-10 13:20 +0300 /31 rader/ Jarno Huuskonen <Jarno.Huuskonen@uku.fi> Sänt av: joel@lysator.liu.se Importerad: 2001-07-10 17:32 av Brevbäraren Extern mottagare: Paul Starzetz <paul@starzetz.de> Extern kopiemottagare: bugtraq@securityfocus.com Mottagare: Bugtraq (import) <17892> Kommentar till text 6729572 av Paul Starzetz <paul@starzetz.de> Ärende: Re: Tripwire temporary files ------------------------------------------------------------ From: Jarno Huuskonen <Jarno.Huuskonen@uku.fi> To: Paul Starzetz <paul@starzetz.de> Cc: bugtraq@securityfocus.com Message-ID: <20010710132041.C38666@messi.uku.fi> On Tue, Jul 10, Paul Starzetz wrote: > Jarno Huuskonen wrote: > > > I found out about the problem when I noticed a temporary file > > /tmp/twtempa19212 left in /tmp. Out of curiosity I ran the tripwire > > binary with strace and noticed that temporary files in /tmp are opened > > without the O_EXCL flag. > > Here a strace from tripwire 1.2 (Source RPM: tripwire-1.2-223.src.rpm): > > open("/tmp/twznG1Eud", O_RDWR|O_CREAT|O_TRUNC, 0666) = 4 > open("/tmp/twzd9tWqg", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 > open("/tmp/twzzykpkj", O_RDWR|O_CREAT, 0600) = 4 > > nowhere the current pid is used - instead a 6 byte template appears, > which is not really predictable (at least shouldn't be!). So that version of tripwire is not compiled with glibc that uses a letter + pid as the unique/random part. I only mentioned that the binary version of tripwire (2.2.1) avalaible from www.tripwire.com does that. But as you can see it doesn't use O_EXCL so if the 'random' file happens to be a symlink tripwire will overwrite files. -Jarno (6729755) /Jarno Huuskonen <Jarno.Huuskonen@uku.fi>/(Ombruten)