[Qt5-feedback] Fwd: Re: Qt major versions
Till Oliver Knoll
till.oliver.knoll at gmail.com
Wed Jun 8 21:49:54 CEST 2011
Am 08.06.11 12:33, schrieb Thiago Macieira:
> On Wednesday, 8 de June de 2011 10:55:54 Till Oliver Knoll wrote:
>> Well, let me elaborate: on Windows the equivalent of LD_LIBRARY_PATH is
>> PATH. [...]
>
> You know, this was a vector attack on Windows last year. It affected Qt-based
> applications, like VLC.
That was /exactly/ the case I had in mind when writing about "DLL
injection" using LD_LIBRARY_PATH. ;)
And it did not just affect Qt applications: *lots* of applications where
affected, IIRC even Microsoft ones ;)
But as you have clarified this won't work when the executable has setuid
bit set (for privilege escalations, for example).
> The problem is that PATH isn't searched last. After it, Windows searches the
> current directory.
PATH is really searched last, refer again to
http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx
"1. The directory where the executable module for the current process is
located.
2. The current directory.
3. The Windows system directory. The GetSystemDirectory function
retrieves the path of this directory.
4. The Windows directory. The GetWindowsDirectory function retrieves the
path of this directory.
5. The directories listed in the PATH environment variable."
So it is actually *even worse* than you describe: the Current Directory
is /normally/ searched already in the 2nd place - even before the System
and Windows folders! And that can't be stressed enough!
Why on earth should an application search for DLLs in the Current
Directory? Well, ask Microsoft ;) They realised this was a bad idea as
well (but I guess due to compatibility reasons cannot undo that "design
decision").
So there IS a compiler (or was it a registry entry? More likely...)
switch which moves down the search order of the Current Directory (at
least after the System and Windows folders, probably even after PATH).
> Here's the attack method:
> 1) user receives "Cool.zip" and unpacks it somewhere
>
> 2) the unpack contains two files: Cool.mp3 and wintab32.dll
>
> 3) the user double-clicks on Cool.mp3, which launches VLC from that directory
>
> Since the system doesn't have a Wacom tablet, so there's no wintab32.dll in
> the system dirs. When Qt probes for the Wacom drivers, it tells the system to
> LoadLibrary("wintab32") and that will be resolved on the current directory.
Exactly - actually this "security flaw" is known since years (but people
tend to forget ;)
I think it gained "popularity" again last year since apparently loading
DLLs also works from "network mapped drives" (or even WebDAV mounted
drives - anything remotely accessible in any case, can't remember - I
think that was a new feature or so, hence the popularity to exploit it
again), so if an evil user could make another user click on said
Cool.mp3 on that remote drive.... BANG!
> ...
>> That would mean there was NO way on Linux/Unix to make sure an executable is
>> picking up a lib from a well-defined location! And simply pointing
>> LD_LIBRARY_PATH to a malicious lib would open that lib instead of the
>> proper one (and maybe that lib would even inherit root access!).
>
> No, you cannot force it. Why do you want to know more than the user? If the
> user has set LD_LIBRARY_PATH, the user has a good reason to.
Well, my idea was to prevent "library injections" from evil users who
want to become root. But as you have already clarified this is not
possible, since LD_LIBRARY_PATH is ignored if the executable has root
privileges.
But originally I did not even know about RUNPATH (just RPATH), and I
simply wanted to avoid to set LD_LIBRARY_PATH in a startup script (no
startup script at all), or even worse, have the user set it.
So I changed my application to the more user-friendly RUNPATH ;)
>
> LD_LIBRARY_PATH does *not* affect setuid and setgid executables. The loader
> skips it if geteuid() != getruid().
Right. So no danger in using LD_LIBRARY_PATH :)
Cheers, Oliver
More information about the Qt5-feedback
mailing list