Snyk CodeでTrojan Source（トロイのソース）攻撃を防ぐ

本記事は、2021年11月17日に公開したブログ[How to prevent Trojan Source attacks with Snyk Code](https://snyk.io/blog/how-to-prevent-trojan-source-attacks-with-snyk-code/)を日本語化した内容です。

![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/dee60280-b79c-db40-74c6-a2e58d17b467.png)


#はじめに
今月初め、ケンブリッジ大学の研究者グループは、ソースコードに現れる可能性のある新しいタイプの潜在的な脆弱性に関する[学術論文](https://www.trojansource.codes/trojan-source.pdf)を発表し、それに関する[ウェブサイト](https://www.trojansource.codes/)を公開しました。彼らはこれを「Trojan Source」（トロイのソース）と名付けました。

この脆弱性の基本的な考え方は、コード内でユニコード文字を使用することで、変数名やコメントに素敵なオプション（例えば、絵文字を使ってコメントで感情を表現するなど）を追加する一方で、残念なことに、潜在的に悪意のあるセマンティクスをコード内の（人間の）目に見えるところに隠すことができるというものです。例えば、攻撃者は、コードに有効な認証ロジックが含まれているかのように見せかけながら、実際には（あるいはコンパイラ／インタプリタにとっては）全く別の動作を行っているかもしれません。また、アクティブなコードのように見えても、実際にはコメントに過ぎず、実行時には無視されることもあります。このようなことを、人間の目を欺くためにユニコード文字を使って行うのです。

この脆弱性の複雑さに興味をお持ちの方は、[オリジナルのウェブサイト](https://www.trojansource.codes/)や[論文](https://www.trojansource.codes/trojan-source.pdf)をご覧になることをお勧めします。また、この脆弱性がJavaScriptで実際に使われているところを見たい方は、私の同僚であるLiran Talが、ESLintを使ってJavaScriptのコードベースにおけるトロイのソース攻撃を効果的に検出し、緩和する方法について[ブログ記事](https://snyk.io/blog/how-to-detect-mitigate-trojan-source-attacks-javascript-eslint/)を書いていますので、そちらをご覧ください。

この記事では、Snyk Codeを使ってソースコードのTrojan Source（トロイのソース）を見つけて修正する方法を紹介します。

#Snyk CodeはTrojan Source（トロイのソース）を修正できるか？
ウェブサイトが公開されたその日のうちに、上記のような質問が寄せられました。それに対する社内での議論の様子をご紹介しましょう。チームに聞いてみたところ、最初の反応は、（1）サプライチェーン攻撃は実現可能と思われるが、ソースコードにアクセスする必要があるため、オリジナルのコードにはあまり効果がない、（2）この攻撃は構文レベルで機能する、というものでした。

注：[Liran氏の記事](https://snyk.io/blog/how-to-detect-mitigate-trojan-source-attacks-javascript-eslint/)にあるように、Trojan Source（トロイのソース）は構文レベルでの攻撃であるため、ESLintはJavaScriptの開発者に役立ちます。残念ながら、Java、Ruby、C#などの他のエコシステムでは、この脅威ベクトルを軽減するための新しいツールの恩恵を受けられないかもしれません。そのため、Snyk Codeはツールボックスに加えるべき重要なツールとなっています。

コミュニティでの反響やお客様からのご要望を受けて、Trojan Source（トロイのソース）問題に対応するルールを追加することにしました。これは深刻度の高い問題ではないため（最近の報道で注目されているだけ）、修正を急がず、現在のスプリントにタスクとして追加しました。しかし、それだけでは終わりませんでした。このルールを追加している間にも、関連する混同しやすいUTFの脆弱性のクラスがあり、それらについてもカバレッジを追加しました。そして最後に、ルールセットが[Snyk Codeでサポートされているすべての言語](https://docs.snyk.io/products/snyk-code/snyk-code-language-and-framework-support)に対応していることを確認しました。

重要なのは、Snyk Codeでサポートされているすべての言語用のTrojan Source（および関連）ルールを開発してリリースするのに10日間しかかからなかったことです。これは、Snyk Codeの俊敏性を示す完璧な例です。決定、コーディング、サポートされているすべての言語の何十万ものプロジェクトでのテスト、最適化、リリースを10日間で実現しました。また、数時間の開発でTrojan Sourceをカバーしただけでなく、関連する問題にまで対応したのは、Snyk CodeのML（機械学習）強化エンジンの力を証明しています。

![blog-trojan-source-confusing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/a01eff60-82dc-7694-cec2-8173151c5333.png)
![blog-trojan-source-bidi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/22844859-be0a-fa6f-0c5d-4b94e4247a42.png)

#Snyk CodeはTrojan Source（トロイのソース）と他の危険な変異種を検知する
Trojan Source（トロイのソース）は、オープンソースのサプライチェーン攻撃として登場する可能性が高いですが、（Liran氏のブログにあるように）アプリケーションコードに直接コピーペーストして実行することも可能です。そのため、Snyk Codeには、コードベースにあるTrojan Source（トロイのソース）タイプの問題をスキャンする機能が含まれています。

注：Snykは、[オープンソースのサプライチェーンのセキュリティ](https://snyk.io/blog/preventing-malicious-packages-and-supply-chain-attacks-with-snyk/)を確保するための強力なツールでもあり、[依存関係のセキュリティ](https://snyk.io/product/open-source-security-management/)や[ライセンス・コンプライアンス](https://snyk.io/product/open-source-license-compliance/)に関わる問題を容易に監視・修正することができます。

前述のように、Trojan Source（トロイのソース）の検出機能を開発するのに数日を要しましたが、Snyk Codeは他の多くのツールが提供するものよりも多くの攻撃のバリエーションを検出することができます。例えば、Snyk Codeは双方向制御文字を検出するだけでなく、コードの真のセマンティクスを隠す可能性のあるメソッド名や変数名に使用されている紛らわしいUTF文字も検出することができます。つまり、現在、Snyk Code はTrojan Source（トロイのソース）で説明されている問題のうち、私たちが知っている他のどのチェッカーよりも最も広範囲に検出することが可能です。

注：Snyk Code は、Java、JavaScript、TypeScript、PHP、Python、そしてパブリックベータとして C#、Ruby、Goをサポートしています。Trojan Sourceは他の言語(例えばBashスクリプト)を攻撃することができますが、Snyk Codeがサポートしていない言語ではスキャンできません。

#Snyk CodeはTrojan Source（トロイのソース）のアキレスの踵
このように、Snyk Codeは様々なスキャンに対応できる強力なエンジンを提供しています。独自のアルゴリズムを用い、グローバルな開発者コミュニティからも常に最新の情報を得ながら日々改善しています。その上で、市場の変化やTrojan Source（トロイのソース）のような進化する問題に素早く対応することができます。その結果、Snyk Codeは、Trojan Source（トロイのソース）だけでなく、関連する脆弱性を既存の知識ベースに基づいて検出し、業界をリードしています。脆弱性に関する問題があれば、オリジナルのソースコードを使用して説明され、オープンソースプロジェクトが同様の課題をどのように解決したかという例などの追加的なヘルプ情報を提供し、デベロッパーの理解と問題の修正をサポートします。

Snykは、お気に入りの統合開発環境（IDE）を使って、これらの機能を圧倒的な速さで提供します。しかも、無料で利用できるのですから、試してみる価値は十分にあると思います。ぜひ無料トライアルをお試しください！無料トライアルは[こちら](https://snyk.co/qiita)からどうぞ。

（参考記事）
[【無料トライアル】セキュリティの「めんどくさい」を解決したい！デベロッパーファーストのSnyk入門編](https://qiita.com/SnykSec/items/aa80a976eb17299fff62)

#最後に
Snykでは日本語のTwitterアカウントを開設しました。ぜひフォローをお願いします。
[https://twitter.com/snykjp](https://twitter.com/snykjp)

またアドベントカレンダー2021にも参加していますので、ぜひエントリーをお願いします。3名様にプレゼントが当たるプレゼントカレンダーです！
[https://qiita.com/advent-calendar/2021/snyk](https://qiita.com/advent-calendar/2021/snyk)