CXX.POSIX.VFORK

vfork() を使用しない

POSIX の vfork() 関数は、セキュリティの脆弱性が多く知られているため、使用しないでください。

脆弱性とリスク

POSIX 固有の vfork() 関数は、未定義の動作をしばしば引き起こします。また、vfork() 関数を使用すると、競合状態を発生させる可能性があります。権限があるプロセスが vfork() 関数を呼び出し、その子プロセスが execve() 関数を呼び出す場合、子プロセスの権限は親プロセスよりも低くなりますが、子プロセスの実行中に親プロセスは停止します。このため、親プロセスを停止したままにしておくことで、攻撃者は子プロセスを継続的に要求し、サービス拒否攻撃を実行できます。

軽減と防止

vfork() の代わりに fork() 関数を使用します。

脆弱コード例

コピー
void func(char *filename)
{
        pid_t pid = vfork();
        if (pid == 0) /* child */ {
                if (execve(filename, NULL, NULL) == -1) {
                        /* Handle error */
                }
                _exit(1); /* in case execve() fails */
        }
}

上記のコードでは、vfork() 関数の代わりに fork() 関数を使用して、サービス拒否攻撃と競合状態を防ぐことができます。