ああ!実はタイトルほど深刻ではありません!
ただし、以下は製品開発の初期段階における悲惨な事例です。その他のセキュリティ脅威については、コマンド実行を超えた脅威について言及している Bei Bei の「Python hack」PPT をご覧ください。個人的な経験のコード。
コマンドを実行するときは、他の受信データを信頼しないようにしてください。問題を認識したので、それを修正するさまざまな方法があります。
私たちのシステムでは、複数の場所での問題を修正することは信頼できないため、ユニバーサル セキュリティ実行インターフェイスが必要です。これは後で更新されます。
さらに、新しい機能を開発するときは、コマンド実行の安全性に限定されない、安全なプログラミングの標準的なスキルも習得する必要があります。
要約すると、いくつかの要素があります:
• 入力パラメータをコマンドによって実行される文字列に結合しないでください。結合する必要がある場合は、入力パラメータをホワイトリストに登録します。たとえば、入力パラメータがわかっている場合は、そのパラメータに対して型検証を実行する必要があります。はい、int でテストしてください。より安全です
• たとえば、int 型のパラメータを結合する場合は、パラメータに %s の代わりに %d を使用します。
•サブプロセスを使用して複数のパラメータを渡し、コマンドラインインジェクションを防ぎます
例 1 (変数はフィルタリングされません):
a.py
サイト変数は実際にはフィルタされていない URL 形式の文字列です。旧バージョンではサイト形式に問題はなかったのですが、新バージョンではURL形式に対応したため、さまざまな記号を渡すことができます。
util/update.py
downloadFile 関数は fileName のフィルタリングを使用しますが、それをバイパスする方法はたくさんあります。
Linux ではコマンドを分離する方法がたくさんありますが、ブラックリストによる方法は信頼できません。
例 3 (安全でない形式文字列):
b.py
ターゲットは、フィルターされていない URL 形式の文字列です。また、潜在的な脅威が存在します。実際には、これは int である必要があるため、将来、ディープ変数に感染する可能性がある場合は、xxoo を使用します。
c.py
site_report 関数、tid パラメーターはフォーマットされておらず、データベースをクエリするステートメントがあるため現在使用できません:
get_object_or_404(Task, get_domain_query(request), id=tid)#ここでは、特殊記号を含む tid が見つからないため、404 となり、以下の cmd スプライシングを一時的に保護します。
このステートメントが変更されると、新たなコマンド インジェクションの脆弱性が発生します
cmd = 'sh /opt/report %s >/tmp/export_report.log 2>&1' % tid