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() は別のスレッドによってその戻り値を変更できます。このため、この関数の戻り値に基づいて認可を付与すると、セキュリティ上のリスクになる可能性があります。