UbuntuとCentOSでLD_PRELOADを介してライブラリ関数をリンクするときの動作の違い

UbuntuとCentOSでLD_PRELOADを介してライブラリ関数をリンクするときの動作の違い

フック機能がありますソケットHook.c傍受ソケット()呼ぶ:

#include <stdio.h>
int socket(int domain, int type, int protocol)
{
    printf("socket() has been intercepted!\n");
    return 0;
}
gcc -c -fPIC socketHook.c
gcc -shared -o socketHook.so socketHook.o

そして簡単なプログラムpwuid.cを入手(1) ただ電話してgetpwuid()機能:

#include <pwd.h>

int main()
{
    getpwuid(0);
    return 0;
}
gcc getpwuid.c -o getpwuid

getpwuid()内部的に一つ作りましたソケット()呼ぶCentOSでは:

$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM, 0)         = 4

Ubuntuから:

$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5

(1)を実行すると、ソケット()CentOSではブロックされますが、Ubuntuではブロックされません。

CentOS 印刷()~からソケットHook.c存在する:

$ uname -a
Linux centos-stream 4.18.0-301.1.el8.x86_64 #1 SMP Tue Apr 13 16:24:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
socket() has been intercepted!

Ubuntu(主な奮闘20.04)。印刷()~からソケットHook.c存在しない:

$ uname -a
Linux ibse-VirtualBox 5.8.0-50-generic #56~20.04.1-Ubuntu SMP Mon Apr 12 21:46:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
$

だから私の質問は次のようになります

  1. それは何に依存しますか?その点で影響を受けたと思います。ソケット()実行可能ファイルから直接呼び出されず、正しく理解されると、libc.soから呼び出されるgetpwuid()から呼び出されます。
  2. Ubuntuと同様に、CentOSでも同じ動作を達成するにはどうすればよいですか? libcの間接呼び出しを傍受したくありません。

ベストアンサー1

おすすめ記事