25

私は、サーバーが変数を置き換える文字列をユーザーが提供できるWebアプリに取り組んでいます。

できれば、 PEP 3101 構文を使用したいと思います。信頼できない入力に対して安全にするために、format()メソッドをオーバーライドする可能性を検討しています。Formatter

現状で私が見ることができるリスクは次の.format()とおりです。

  • パディングを使用すると、任意の長さを指定'{:>9999999999}'.format(..)できるため、サーバーがメモリ不足になり、DOSになる可能性があります。これを無効にする必要があります。
  • Formatを使用すると、オブジェクト内のフィールドにアクセスできます。これは便利ですが、dunder変数にアクセスして、標準ライブラリのビットへのドリルを開始できるのは不気味です。getattr()副作用があるか、何か秘密を返す可能性がある場所はわかりません。をオーバーライドして、属性/インデックスアクセスをホワイトリストに登録しますget_field()
  • 当然、いくつかの例外をキャッチする必要があります。

私の仮定は次のとおりです。

  • パラメータの指定は、スレッドのスタックから直接ポップするのではなく、コレクションへの境界チェックされたアクセスであるため、従来のC形式の文字列エクスプロイトはいずれもPythonには適用されません。
  • 私が使用しているWebフレームワークは、ページテンプレートに置き換えられたすべての変数をエスケープします。出力前の最後の停止である限り、エスケープ解除から発生するクロスサイトスクリプティング攻撃から安全です。

あなたの考えは何ですか?可能?不可能?単に賢明ではありませんか?


編集:Armin Ronacherは、dunder変数アクセスを除外しない場合の厄介な情報漏えいについて概説していますが、セキュリティ保護format()は実行可能であると見なしているようです。

{local_foo.__init__.__globals__[secret_global]}

Pythonの新しいスタイルの文字列形式に注意してください| アーミン・ロンチャーの考えと著作

個人的には、私は実際にformat()私の製品で信頼できないルートをたどりませんでしたが、完全を期すために更新しています

4

2 に答える 2

8

良い本能。はい、攻撃者が任意のフォーマット文字列を提供できることは、Python の脆弱性です。

  • サービス拒否はおそらく最も簡単に対処できます。この場合、文字列のサイズまたは文字列内の演算子の数を制限すると、この問題が軽減されます。合理的なユーザーが X よりも多くの変数を含む文字列を生成する必要がなく、この量の計算が DoS 攻撃で悪用されるリスクがない設定が必要です。
  • オブジェクト内の属性にアクセスできることは危険です。Objectただし、親クラスには有用な情報があるとは思いません。フォーマットに提供されるオブジェクトには、機密性の高いものが含まれている必要があります。いずれにせよ、このタイプの表記は正規表現で制限できます。
  • フォーマット文字列がユーザーによって提供される場合、ユーザーはデバッグのためにエラー メッセージを知る必要がある場合があります。ただし、エラー メッセージには、ローカル パスやクラス名などの機密情報が含まれる場合があります。攻撃者が取得できる情報を制限するようにしてください。

Pythonフォーマット文字列の仕様を調べて、正規表現でユーザーに持たせたくない機能を禁止します。

于 2013-03-13T16:14:56.607 に答える