]> git.ipfire.org Git - thirdparty/hostap.git/commit
Android: Harden wpa_ctrl_open2() against potential race conditions
authorJouni Malinen <j@w1.fi>
Sun, 6 Jan 2019 18:01:09 +0000 (20:01 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 6 Jan 2019 18:20:20 +0000 (20:20 +0200)
commitb686745c76b8fe88a6d4adda1be136d2d74f094c
treeae8d8fc635b17e63acc60a9687cc25b17e9b7bc5
parent9aac73121be5ee186719653d713b3c1c081ae08a
Android: Harden wpa_ctrl_open2() against potential race conditions

The Android-specific chmod and chown operations on the client socket
(for communication with wpa_supplicant) did not protect against file
replacement between the bind() and chmod()/chown() calls. If the
directory in which the client socket is created (depends a bit on the
version and platform, but /data/misc/wifi/sockets is commonly used)
allows write access to processes that are different (less privileged)
compared to the process calling wpa_ctrl_open2(), it might be possible
to delete the socket file and replace it with something else (mainly, a
symlink) before the chmod/chown operations occur. This could have
resulted in the owner or permissions of the target of that symlink being
modified.

In general, it would be safest to use a directory which has more limited
write privileges (/data/misc/wifi/sockets normally has 'wifi' group
(AID_WIFI) with write access), but if that cannot be easily changed due
to other constraints, it is better to make wpa_ctrl_open2() less likely
to enable this type of race condition between the operations.

Replace chown() with lchown() (i.e., a version that does not dereference
symlinks) and chmod() with fchmod() on the socket before the bind() call
which is also not going to dereference a symlink (whereas chmod()
would). lchown() is a standard operation, but the fchmod() on the socket
is less so (unspecified behavior in some systems). However, it seems to
work on Linux and in particular, on Android, where this code is
executed.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/common/wpa_ctrl.c