PyPIには悪意のあるソフトウェアが登録されている

いわゆるtyposquatting案件です。

skcsirt-sa-20170909-pypi | NBU

Pytosquatting

まずやばさを感じる一例を。

PyPIにはurllib3というサードパーティ製のHTTPクライアントがある。今回、このurllib3からわずかに名前を変更した、悪意のあるソフトウェアが登録(urlib3, urllib)されていたことが確認された。このようなパッケージはpip install urllibのような形で、pipからの打ち間違えを狙っている(これをtyposquatting攻撃という)。2017.6 〜 2017.9の間に、これらのパッケージがダウンロードされ、他のソフトに組み込まれてていたことも確認されている。


こうしたパッケージは、urllib3を標的にしたもの以外にも存在が確認されている。リストは以下。

– acqusition (uploaded 2017-06-03 01:58:01, impersonates acquisition)
– apidev-coop (uploaded 2017-06-03 05:16:08, impersonates apidev-coop_cms)
– bzip (uploaded 2017-06-04 07:08:05, impersonates bz2file)
– crypt (uploaded 2017-06-03 08:03:14, impersonates crypto)
– django-server (uploaded 2017-06-02 08:22:23, impersonates django-server-guardian-api)
– pwd (uploaded 2017-06-02 13:12:33, impersonates pwdhash)
– setup-tools (uploaded 2017-06-02 08:54:44, impersonates setuptools)
– telnet (uploaded 2017-06-02 15:35:05, impersonates telnetsrvlib)
– urlib3 (uploaded 2017-06-02 07:09:29, impersonates urllib3)
– urllib (uploaded 2017-06-02 07:03:37, impersonates urllib3)

これらのパッケージは元のパッケージと同等の機能を有するが、setup.pyに悪意のあるコードが仕込まれている。ただし、現在発覚しているsetup.pyの悪意のあるコードは、比較的無害である。実行されると、以下の情報をHTTPリクエストを介してhttp://121.42.217.44:8080/というリモートサーバーに送るだけである。

  • 偽パッケージの名前とバージョン
  • パッケージをインストールしたユーザー名
  • ホスト名

形式はY:urllib-1.21.1 admin testmachineといったもので、base64エンコードとハードコードされたパスワードでXOR暗号化がかけられている。サーバーアドレスとポートも同様に難読化されていた。

偽パッケージに追加されたコードのコーディングスタイルはPython 3.xに適合しておらず、インストールに失敗したという例はネット上で何度も報告されてきた。報告者が知る限りでは、現在セキュリティ上のインシデントは確認されていない。

本攻撃はシステム管理者や開発者の不注意に依存する。pipがパッケージのインストール中に暗号署名を必要とせず、任意のコードを実行できてしまうのもよくない。またPyPIは誰でも簡単にパッケージを登録できてしまい、品質保証やコードレビューが存在しないというのも一因である。


これらのパッケージについて報告者はPyPI管理者に報告を行い、速やかに削除されいる。


インストールしてしまったら
1. 偽パッケージを削除する

以下のコマンドを実行し、

pip list –format=legacy | egrep ‘^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib) ‘

1つでもリストアップされたパッケージがあったら

pip uninstall [package]

で削除する。直接ディレクトリを削除する手もある。pipが汚染されている可能性もなきにしもあらずなので、この方がより安全である。

2. 安全なPython開発を心がける

ネットからインストールするものなので注意しよう。

3. 偽パッケージに依存していた他のソースコード

機能は同じなので変更する必要はないようだ。