eval() 関数を含むコードを送信しようとしたときに、pythontutor.com、programmr.com、coursera.org autotesterなどのすべての Web コンパイラが名前エラーを返しました。この関数を Web コンパイラに実装しない理由は何ですか?
3 に答える
eval
関数は確かに悪用される可能性があり、セキュリティ リスクです。
私はこれを突き刺します:
編集
私は自分が間違っていることを認めたくありませんが、この場合はそうしなければならないと思います。
どちらの方法でも use コードを実行していることは事実であるため、インタープリターを実際に保護する必要があることを指摘しておきます。私は今でも、「インタープリター内にアクションが存在する場合、許可されたアクションをブラックリストに入れようとしても、ホワイトリストに入れようとしても意味がない」と信じており、ブロックexec
してeval
わずかな利益しか得られません。
重要なポイントは次のとおりです。
その Python Tutor の作成者は、外部から渡されたコードを実行しました。を含む多くのものをブロックしているにもかかわらずexec
、それらは外部コードの実行を許可したため、私が見つけたエクスプロイトがあります。現在、ブロックされたモジュールのみをインポートしましたが、ソースを読むと、無制限の IO も実行できます。
さらに編集: Python Tutor の所有者に連絡しましたが、彼はそのようなことを認識していると言いました。おそらく保護は下位レベルにも存在します。したがって、これはエクスプロイトではありませんが、それは主に「下位レベル」での保護があるためです。これが、ブラックリストではなく、攻撃を防ぐための方法です。
さらに、さらに編集: Python Tutor をダウンさせましたが、サイトは再びアップしているように見えます (機能していない、ただアップしているだけです)。所有者のフィリップ・グオの)。少なくともサイトを壊すことができるようです:/。すみません、事故でした。ただし、信頼されていないコードを実行することが危険であることは確かに証明されています。これは、私がずっと言ってきたことです。
ただし、質問は意図exec
について尋ねており、ブロックが実際に違いを生むかどうかについてではありません。
http://pgbovine.net/projects/pubs/guo-sigcse-preprint_2012-11-13.pdfを読む、つまり
バックエンドは Web から信頼されていない Python コードを実行しているため、サンドボックスを実装して
eval
、 、exec
、ファイル I/O などの危険な構成の実行と、ほとんどのモジュールのインポート ( などのモジュールのカスタマイズ可能なホワイトリストを除くmath
) を防ぎます。
とをどのように扱うべきかについて私が間違っているとは認めませんが、サイトの所有者があなたがすべきだと考えていたことについては間違っていました (確かに、彼はあなたがサンドボックス化する必要があることも認識しています)。exec
eval
私が以前書いたもの:
まず、安全性とはほとんど関係ありません。あいまいさによる安全は決して機能せず、試みるのはばかげたことです。動的言語で関数の呼び出しを探して、悪い関数をブラックリストに登録することはできません。隠蔽の簡単な例
import os; while True: os.fork()
だろう
import os
while True:
os.__dict__["fork"]()
だから保護はありません。繰り返しますが、インタープリター内にアクションが存在する場合、許可されたアクションをブラックリストに登録しようとしても、ホワイトリストに登録しようとしても意味がありません。これは、到達できるものは なしeval
で到達できることを意味するため、ブロックしてもセキュリティは得られません。 eval
eval
本当の理由は、これらが典型的な Python コンパイラー・インタープリターではないからだと思います。コードが行っていることの多くは、Javascript またはその他の厄介なプラットフォームにプッシュされます。
コードを詳しく調べると、バイトコードへのコンパイル時に、名前バインディングなどの一部がハードコードされていることに気付くでしょう。「eval」などを実行する場合、コードをインラインで実行するだけではなく、コンパイルしてスコープから動的に抽出する必要があります。ターゲット言語でこのようなダイナミズムをサポートすることは困難な作業であり、ライターはおそらくそれを行う価値があるとは考えていませんでした.
これは、コードがクラウドでコンパイルされ、ローカルで実行される場合に特に当てはまります。eval
したがって、機能するためにサーバーへのラウンドトリップが必要になります! これは推奨される行動ではありません。
これは私の推測ですが、このようなものが実際にどのように実装されているかはわかりません。