悪意のあるスクリプトインジェクションからPythonアプリケーションを保護する方法





Pythonアプリケーションは多くのスクリプトを使用します。これは、サイバー犯罪者が私たちに「豚」を置くために使用するものです-私たちがそれを見ることを最も期待していない場所です。



Pythonの利点の1つは、その使いやすさです。スクリプトを実行するには、スクリプトを.pyファイルに保存してコマンドを実行するだけですpython (, python my_file.py)それは、このようなモジュールとして、私たちのファイルを壊すことは容易でもあるmy_app.pyし、my_lib.pyデザインを使用するようにモジュールを接続し続けますimport...from: import my_lib from my_app.py



ただし、この単純さと軽さには欠点があります。さまざまな場所からコードを実行するのが簡単であるほど、攻撃者が干渉する機会が増えます。



Pythonコードを安全な場所に配置する



Pythonセキュリティモデルは、次の3つの原則に基づいています。



  1. , sys.path , .
  2. , (main), sys.path.
  3. python , -c -m.


マシンに「正しく」インストールされているPythonアプリケーションを実行するとします。この場合、デフォルトでsys.pathに自動的に追加される(Pythonがインストールされているフォルダーを除く)唯一の場所は、メインスクリプトまたは実行可能ファイルのあるフォルダーです。



たとえば、pipがに/usr/binあり、を実行する/usr/bin/pipと、sys.pathのみが追加され/usr/binます。 rootのみが/ usr / binにファイルを書き込むことができるため、この場所は安全であると見なされます。



それにもかかわらず、合意は私たちにそうすることを要求しています:/path/to/python -m pip。これにより$PATH、Windowsドキュメントの問題や競合が回避されます。



一般に、Pythonがモジュールをインポートするディレクトリにファイルを追加および編集する権限を持っているのはあなただけであれば、とにかくすべてがうまくいくでしょう。



ダウンロードフォルダ-脆弱な場所



ユーザーの知らないうちに、ブラウザー(および場合によっては他のソフトウェア)に任意の名前のファイルをDownloadsフォルダーに配置させる方法はたくさんあります。この脆弱性は、DLLスプーフィング攻撃によって悪用されます。この例では、Pythonスクリプトについて説明しますが、考え方は同じです。



ブラウザはこれについてより深刻になり、ユーザーがアクセスしたサイトがファイルをダウンロードフォルダに密かにドロップできないようにすることを徐々に試みています。



ただし、この問題を完全に解決することは非常に困難です。たとえば、Content-Disposition HTTP header’s filename*アップロードされたファイルを配置するディレクトリをサイトが選択できるオプションは引き続き利用できます。



攻撃のしくみ



インストールを実行しますpython -m pip完全に信頼できるWebサイトからPythonパッケージをダウンロードしていますが、何らかの理由で、PyPIではなく直接ダウンロードを提供しています。多分それはある種の内部バージョンであるかもしれません、多分それは予備リリースです-違いはありません。だからそれはあなたに行きますtotally-legit-package.whl



~$ cd Downloads
~/Downloads$ python -m pip install ./totally-legit-package.whl


大丈夫なようですが、2週間前にアクセスしたまったく別のサイトで、XSSJavaScriptの一部が知らないうちにダウンロードフォルダにマルウェアを含むpip.pyをダウンロードしたことが判明しました。



ブーム!



クラッシュ!



~$ mkdir attacker_dir
~$ cd attacker_dir
~/attacker_dir$ echo 'print("lol ur pwnt")' > pip.py
~/attacker_dir$ python -m pip install requests
lol ur pwnt


奇妙な行動 PYTHONPATH



上記のいくつかの段落、私は書いた:



デフォルトでsys.pathに自動的に追加される唯一の場所(Pythonがインストールされたフォルダーを除く)は、メインスクリプトまたは実行可能フォルダーです。


では、ここで「デフォルト」は何をするのでしょうか。他にどのような場所を追加できますか?



基本的に、環境変数には$PYTHONPATH何でも書き込むことができますしかし、あなたはあなたの現在の場所を書きません$PYTHONPATHよね?



残念ながら、誤ってこれを行う可能性がある状況があります。

説明のために「脆弱な」Pythonアプリケーションをスケッチしてみましょう。



# tool.py
try:
    import optional_extra
except ImportError:
    print("extra not found, that's fine")


2つのディレクトリを作成しましょう:install_dirattacker_dir失敗してからinstall_dircd attacker_dir悪意のあるコードを実行して、次の名前で配置しtool.pyます。



# optional_extra.py
print("lol ur pwnt")


残っているのはそれを実行することだけです:



~/attacker_dir$ python ../install_dir/tool.py
extra not found, that's fine


これまでのところ、すべてが順調に進んでいます。



しかし今、私たちはよくある間違いを見るでしょう。多くの人々が一つに加えることをお勧めします$PYTHONPATH以上の事



export PYTHONPATH="/new/useful/stuff:$PYTHONPATH";


一見すると、これは理にかなっています。プロジェクトXを$PYTHONPATH追加すると、おそらくプロジェクトYに従って、そこにも何かが追加されたか、追加されなかったかがわかります。いずれにせよ、他のプロジェクトに関連する変更を上書きしたくないでしょう。これは、多くの人が使用するドキュメントを作成するときに特に重要です。



そして今、私たちは「奇妙な」行動に直面しています$PYTHONPATH$PYTHONPATH空であるか、最初の起動前にインストールされていない場合は、空の行が表示され、現在のディレクトリとして認識されます。これを確認しましょう:



~/attacker_dir$ export PYTHONPATH="/a/perfectly/safe/place:$PYTHONPATH";
~/attacker_dir$ python ../install_dir/tool.py
lol ur pwnt


セキュリティを強化するために、$PYTHONPATH空にして再試行してみましょう。



~/attacker_dir$ export PYTHONPATH="";
~/attacker_dir$ python ../install_dir/tool.py
lol ur pwnt


正確には、それはまったく安全ではありません!



そしてもう1つ、変数が$PYTHONPATH空の場合と変数が$PYTHONPATH設定されていない場合の状況は2つの異なるストーリーであることがわかります。



os.environ.get("PYTHONPATH") == ""</code>  <code>os.environ.get("PYTHONPATH") == None.


確実にクリーンアップ$PYTHONPATHする場合は、次のコマンドを使用しますunset



~/attacker_dir$ python ../install_dir/tool.py
extra not found, that's fine


一般に、変数への書き込み$PYTHONPATHは、Pythonアプリケーションを実行するための環境をセットアップする最も一般的な方法でした。幸いなことに、仮想環境とvirtualenvの出現により、時代遅れになりました。に何かを書き込む古い構成があり$PYTHONPATH、それがなくても実行できる場合は、今がそれを削除するときです。



何らかの理由でこれを行うことができない場合は、ライフハックを使用してください:



export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}new_entry_1"
export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}new_entry_2"


bashとzshでは、これにより次の出力が得られます。



$ echo "${PYTHONPATH}"
new_entry_1:new_entry_2


さて、今では余分なコロンや空のエントリはありません。



そして最後に:まだ作業している場合は$PYTHONPATH、絶対パスを使用してくださいいつも!



問題ははるかに深刻です



DownloadsフォルダーからのPythonファイルの起動に関連するイベントの危険な開発には、いくつかのオプションがあります。



  • pythonの実行~/Downloads/anything.py(それ自体がanything.py安全であっても)。ダウンロードフォルダがに追加されsys.pathます。
  • 起動すると、jupyter notebook ~/Downloads/anything.ipynbダウンロードフォルダもに追加されsys.pathます。


したがって、実行する前に、このフォルダーから.pyファイルと.ipynbファイルを削除することをお勧めします。インポートされたファイルがDownloadsフォルダーにある場合、



実行cd Downloadsとその後のpython -c命令による起動importまたはpython後続のインポートによる対話型起動では、問題は完全には解決されません。



残念ながら、~/Downloads/悪意のあるファイルを含めることができる場所はこれだけではありません。たとえば、ユーザーがファイルをアップロードできるサーバーを管理している場合はcd public_uploads、コマンドを実行する前に、誰も何も起動できないことを確認してpythonください。



この場合、ファイルのアップロードを処理するコードが名前に追加されることを検討する価値があるかもしれません.uploadedこれにより、計画外のスクリプト実行を回避できます.py



注意事項



Downloadsフォルダー内で使用するPythonで記述されたアプリケーションがある場合/ path / to / venv / bin / pipは、モジュール(/ path / to / venv / bin / python -m pipではなく、スクリプト(へのパスを入力することをルールにします



一般に、ダウンロードを現在の作業ディレクトリとして使用することは避け、使用するスクリプトを開始する前に、より適切な場所に移動してください。



Pythonが実行するコードをどこから取得するかを理解することが重要です。左側のPythonスクリプトを1行でも実行させることは、コンピューターを完全に制御することと同じです。



必然的に



セキュリティに関する「ヒントとライフハック」を含むこのような記事を読むと、作成者は非常に賢く、他の人が知っておくべき小さなことをたくさん知っていて、常に考えていると考えるのは簡単です。しかし実際には、これは完全に真実ではありません。説明します。



何年にもわたって、Pythonがどこからコードをダウンロードしているのかをユーザーが理解していないことをうらやましいほど頻繁に観察してきました。たとえば、Twistedを使用した最初のプログラムをtwisted.pyというファイルに入れます。しかし、この場合、ライブラリのインポートは単純に不可能です。



サイバー犯罪者は、システム管理者や開発者を攻撃することに成功した場合、さらに多くの喜びを感じます。ユーザーをハッキングすると、そのユーザーのデータが取得されます。しかし、管理者または開発者をハッキングして正しく実行すると、システムが管理者の管理下にある数千人のユーザー、または開発者ソフトウェアを使用する数百万人のユーザーにアクセスできるようになります。



したがって、「常に注意する」というのは信頼できるレシピではありません。多数のユーザーがいる製品を担当するITプロフェッショナルは、もっと注意する必要があります。少なくとも、特定の開発ツールの作業の特殊性について通知する必要があります。



バグまたは機能..。



私が上で説明したことのどれも、実際には本当の「バグ」または「脆弱性」ではありません。 PythonやJupyterの開発者が間違って何かをしたとは思いません。システムは設計どおりに機能し、それはおそらく説明できます。個人的には、私たちが非常に重視しているPythonの能力を削減せずに、何かを変更する方法がわかりません。



私のお気に入りの発明の1つは、テーブルソー用のユニークな安全システムであるSawStopです。人体に接触すると、5ミリ秒以内に鋸刃の回転を停止できます。このシステムが発明される前は、テーブルソーは非常に危険なツールでしたが、重要な生産機能を果たしていました。テーブルソーでは、非常に便利で重要なことがたくさん行われています。しかし、テーブルソーが木工所での事故の不均衡な割合を占めていたことも事実です。 SawStopは、毎年多くの指を節約するようになりました。



したがって、Pythonスクリプトの複雑さを詳しく説明することで、セキュリティエンジニアにも考えてみたいと思います。SawStopにインタラクティブインタープリターの任意のコードを実行させることはできますか?上記の問題のいくつかを防ぐことができる解決策は何ですか?



安全な友達を維持します。






広告



VDSina、LinuxまたはWindowsで安全なサーバー提供します。プリインストールされているOSのいずれかを選択するか、イメージからインストールします。






All Articles