権限の低いユーザーが高い権限でカスタムスクリプトを実行できるようにする従来のCコードがあります。これにはSUIDビットがセットされています。このコードはPATH環境を特定のフォルダに制限し、system()
apiを使用して制限付きシェルを介してスクリプトを実行します。
/bin/bash -r -c "script <arg>"
パスが制限されているため、特定のフォルダでのみスクリプトを実行できます。
これでAPIコマンドインジェクションのすべてのトラップがわかりましたsystem()
。これはさまざまなスクリプトなど、さまざまな場所で使用されるため、回帰を避けるためにまったく新しい実装を作成したくありません。
答え1
正しく書くのは難しいので、コードからSUIDを削除することをお勧めします。を使用するようにCコードを変更してくださいsudo
。セキュリティシステムプログラミングの難しい側面は、sudoを使用して行われます。
その後、visudoを使用して、タスクを実行するために必要な最小限のタスクを実行し、必要なユーザー/グループに制限するsudo設定を慎重に構築できます。 sudoを設定したら、他の人にテストを依頼して、予想される制限を破るようにしてください。
答え2
コードを挿入するには、ユーザーが任意の文字列を呼び出しの引数として渡すことができる必要がありますsystem()
。これはSQLインジェクションと非常によく似ており、同様の方法で避けるべきです。カスタム文字列を呼び出しに直接渡さないでください。
数値引数は整数に変換し、呼び出し時に再び文字列に変換する必要があります。
固定辞書の一部であるパラメータは、「enum」の値または類似の値に変換され、呼び出し時に文字列として返される必要があります。
[a-zA-Z0-9]*
フリーテキスト入力は、可能であれば無害な文字セット(たとえば)に制限する必要があります。問題のある文字(スペースを含む)が必要な場合は、適切なエスケープを適用する必要があります(たとえば、次のようa b
に置き換える必要がありますa\ b
)。