Hacker holding out hands

PyPI 上の悪意のある Python パッケージは、難読化手法として Unicode を使用して検出を回避し、侵害されたデバイスから開発者のアカウント資格情報やその他の機密データを盗み出します。

「onyxproxy」という名前の悪意のあるパッケージは、ソース コードでさまざまな Unicode フォントの組み合わせを使用して、文字列の一致に基づいて潜在的に悪意のある機能を識別する自動スキャンと防御を回避します。

onyxproxy の発見は、 Phylumのサイバーセキュリティの専門家によるもので、この技術を説明するレポートを公開しました。

このパッケージは、昨日プラットフォームから削除されたため、PyPI では使用できなくなりました。しかし、3 月 15 日にプラットフォーム上で公開されて以来、悪意のあるパッケージは183 回のダウンロードを蓄積しています。

Python で悪用される Unicode

Unicode は、100,000 を超える文字をカバーする共通の標準の下でさまざまなセット/スキームを統合し、さまざまなスクリプトと言語を網羅する包括的な文字エンコーディング標準です。

異なる言語やプラットフォーム間で相互運用性と一貫したテキスト表現を維持し、エンコードの競合やデータ破損の問題を排除するために作成されました。

「onyxproxy」パッケージには、Unicode 文字の混合を使用する何千もの疑わしいコード文字列を含む「setup.py」パッケージが含まれています。

Unicode 文字の組み合わせを使用する
Unicode 文字の混合の使用(Phylum)

これらの文字列のテキストは、フォントが異なるだけでなく、目視検査ではほぼ正常に見えますが、これらの文字を根本的に異なるものとして解析および認識する Python インタープリターにとっては大きな違いになります。

たとえば、Phylum は、さまざまな言語や数学などで使用するために、Unicode には文字 “n” の 5 つの変形と文字 “s” の 19 の変形があると説明しています。 Unicode で表されます。

識別子、つまりコード変数、関数、クラス、モジュール、およびその他のオブジェクトに Unicode 文字を使用するための Python のサポートにより、コーダーは同じように見えるが異なる関数を指す識別子を作成できます。

onyxproxy の場合、作成者は識別子「__import__」、「subprocess」、および「CryptUnprotectData」を使用しました。これらの識別子はより大きく、膨大な数の亜種があり、文字列照合ベースの防御を簡単に破りました。

バリアントは悪意のある識別子としてカウントされます
使用された識別子のバリアント数
(門)

Python の Unicode サポートは、悪意のある文字列の一致を隠すために簡単に悪用される可能性があり、悪意のある動作を実行しながらコードを無害に見せます。この場合、開発者から機密データと認証トークンを盗みます。

この難読化手法は特に洗練されたものではありませんが、実際に使用されていることを心配しており、Python の難読化のために Unicode が広範に悪用されている兆候である可能性があります。

「しかし、この作成者がこの難読化されたコードをコピーした人は誰であれ、Python インタープリターの内部構造を使用して新しい種類の難読化されたコードを生成する方法を知っているほど賢く、コードが何であるかをあまり明らかにすることなく、ある程度読み取り可能な種類のものです。盗もうとしている」とPhylumは締めくくる。

Python における Unicode のリスクは、過去に Python 開発コミュニティで広く議論されてきました。

他の研究者や開発者も以前、Python で Unicode をサポートすると、プログラミング言語が新しいクラスのセキュリティ エクスプロイトに対して脆弱になり、提出されたパッチやコードの検査が難しくなると警告しています

2021 年 11 月、大学の研究者は「 Trojan Source 」と呼ばれる理論的な攻撃を発表しました。これは、Unicode 制御文字を使用してソース コードに脆弱性を挿入し、人間のレビュー担当者がそれらの悪意のある挿入を検出することを困難にします。

結論として、これらの攻撃は現在確認されており、防御側はこれらの新たな脅威に対してより堅牢な検出メカニズムを実装する必要があります。