CXX.GETLOGIN
マルチスレッドアプリケーションで getlogin を使用しないでください
マルチスレッド環境では、ロックしなくてもユーザーアカウントを取得できます。この場合、別のスレッドがユーザーアカウントを読み取ることができます。getlogin() 関数は、呼び出されたスレッドに関連付けられたユーザー名を返します。マルチスレッド環境で使用される場合、返されたユーザー名は別のスレッドによって変更され、不正確な値になる可能性があります。
脆弱性とリスク
マルチスレッドコンテキストでは、getlogin() 関数を使用すると、正しくない値が返される可能性があります。
軽減と防止
これを防ぐには、getlogin_r() 関数を使用します。
脆弱コード例 1
コピー
int isTrustedGroup(int);
int loginproc()
{
struct passwd *pwd = getpwnam(getlogin());
if (isTrustedGroup(pwd->pw_gid))
{
return 1; // allow
}
else
{
return 0; // deny
}
}
上記の例では、アカウント情報を取得し、権限を付与するために、getlogin() 関数が使用されています。マルチスレッド環境では、getloin() は別のスレッドによってその戻り値を変更できます。このため、この関数の戻り値に基づいて認可を付与すると、セキュリティ上のリスクになる可能性があります。