SnykでOSSプロジェクトの脆弱性を調べてみる


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">🏆 オープンソース開発者大賞🏆 Qiita Engineer Festa 2022<a href="https://twitter.com/kannkyoshi?ref_src=twsrc%5Etfw">@kannkyoshi</a> さんの「SnykでOSSプロジェクトの脆弱性を調べてみる」です<br><br>OSS プロジェクトのセキュリティ改善に貢献した点に注目しました。修正版が公開された際には、プロジェクト名等もぜひ教えてください！<a href="https://t.co/hEinRuasyb">https://t.co/hEinRuasyb</a></p>&mdash; Snyk Japan (@snykJP) <a href="https://twitter.com/snykJP/status/1552987367514034176?ref_src=twsrc%5Etfw">July 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# はじめに

昨今のソフトウェア開発において、OSSは必要不可欠なものになっていると思います。

Webシステム、アプリ、IoTシステム・・・。

Linuxやgccも含めると、OSSを使わずにソフトウェアを開発することはほとんどないかなと思います。
便利ですよね。

しかし、[Snyk と Linux Foundation の共同調査](https://prtimes.jp/main/html/rd/p/000000007.000092857.html)によると、

> 41%の企業がオープンソースソフトウェアのセキュリティを信頼していない
> アプリケーション開発プロジェクトには平均で49件の脆弱性があり、80件の直接依存関係があることが判明

ということがわかっています。

ほんとのところどうなのでしょうか？

Snykを使って、実際に調べてみました。

# 調査概要

## 調査対象

2つのプロジェクトを調査対象にしました。

1. C/C++の組み込みフレームワークのプロジェクト
    * 組込みシステムのフレームワーク
    * ソースコードはC/C++
    * 開発用のツールとしてPythonを使用
    * Pythonのパッケージはrequirements.txtで管理
1. Webアプリのプロジェクト
    * ソースコードはJavaScript/TypeScript
    * サーバサイドのコードはexpress.js
    * パッケージはpackage.jsonで管理

## 調査方法

### Fork

GitHubで、OSSのリポジトリをForkします。

### Add project

Snykで、Forkしたリポジトリを取り込みます。Projects 画面右上の`Add project`ボタンをクリックします。

**Projects 画面イメージ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/16f76d6d-f09a-794d-9e94-71615943705b.png)

リポジトリを取り込むと、Snykの自動解析が始まります。

自動解析は2種類あります。

* コード解析
    * ソースコード内の脆弱性を検出する解析。
    * 脆弱性の解説、CWE番号、処置方法などを閲覧できます。
* 依存関係解析
    * package.json, requirements.txt等のパッケージ管理ファイルから脆弱性をもつOSSがないか検出する解析。
    * バージョンを上げるだけで処置できる場合は、プルリクエストを自動的に作成できます。

コード量にもよりますが、1,2分程度で解析は終わります。

### Add target from a custom location

プロジェクトによってはソースコードやパッケージファイルをすべて検出できないことがあります。

そこで、Projects 画面の"Add target from a custom location"から解析対象のパスを追加してみます。

**Projects 画面イメージ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/490fae13-2072-e4d0-5677-b06cc4013895.png)

# C/C++の組み込みフレームワークのプロジェクト

C/C++の組み込みフレームワークのプロジェクトの2つの解析結果を見てみます。

1. コード解析
1. 依存関係解析: requirements.txt

## コード解析

コード解析では、C/C++の脆弱性は検出されませんでした。

脆弱性ゼロなのか、それともC/C++だと検出精度が低いのか・・・。

よくわかりませんでした。

Pythonのコード部分では、InsecureXmlParser脆弱性が2箇所で検出されました。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/b4353a5f-9285-419e-1012-bf66f0038b30.png)

xmlパッケージではなく、defusedxmlパッケージを推奨されています。

xmlはPythonの標準パッケージなんですが・・・。

どういうことでしょうか？

調べてみると、Python Foundation自身がdefusedxmlパッケージの使用を推奨しているようです。

公式ドキュメントでは、つぎのように「警告」表示されていました。

> 警告 XML モジュール群は不正なデータや悪意を持って作成されたデータに対して安全ではありません。信頼できないデータをパースする必要がある場合は XML の脆弱性 と defusedxml パッケージ を参照してください。
> 
> https://docs.python.org/ja/3/library/xml.html

## 依存関係解析: requirements.txt

依存関係解析では、cookiecutterの脆弱性が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/b02e3864-2a1f-f3c6-29fb-b558b5e3a3d5.png)

cookiecutter 1.7.3 には CWE-78 の脆弱性があり、 2.1.1 で処置済のようです。

ソースコードではなく単なるツールなので更新しなくても影響はなさそうですが、ためしに処置してみましょう。
"Fix this Vulnerabillity"ボタンをクリックして、この脆弱性を修正するプルリクを作ります。

![png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/617f837a-42f9-79ca-8370-aa3012c05f25.png)

できました。

# Webアプリのプロジェクト

次に、Webアプリのプロジェクトの2つの解析結果を見てみます。

1. 依存関係解析: package.json
1. コード解析: JavaScript


## 依存関係解析: package.json

package.json内の13個(H:3, M:7, L:3)のパッケージで脆弱性が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/6c0b14c9-0db7-e297-4038-7faea392e17b.png)

多いですね・・・。

Pythonに比べると、npmは小さいパッケージが多く依存するパッケージ数が多くなりがちです。

パッケージ数が多いから脆弱なパッケージも多くなる？のかもしれませんね。

脆弱性が多数見つかった場合は、Snykのソート機能とフィルタ機能でPriority ScoreとCVSS Severityで絞り込みましょう。

* [Priority Score](https://docs.snyk.io/features/fixing-and-prioritizing-issues/starting-to-fix-vulnerabilities/snyk-priority-score
)はSnykの独自指標です。CVSS Severity、エクスプロイトの容易さなどの複数の要素を考慮して決定される数値です。
* [CVSS Severity](https://www.ipa.go.jp/security/vuln/CVSS.html)は、世界で標準化された脆弱性の脅威度を表す数値です。

Priority Scoreが最高(SeverityはMedium)の脆弱性1つとCVSS Severityが High の脆弱性3つの計4つの脆弱性を細かく見てみます。

### Priority Scoreが最高の脆弱性

underscore というパッケージで Arbitrary Code Injection の脆弱性が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/2cad7a2a-cf4c-4c9a-3a5f-4e8ad2e9ac14.png)

Arbitrary Code Injectionってなんやねん、という場合は`Learn about this type of vulnerability`をクリックすると解説サイトが開きます。

https://learn.snyk.io/lessons/malicious-code-injection/javascript/

任意のコードを実行できてしまう脆弱性のようです。

`PRROF OF CONCEPT`と書いてあり、すでに脆弱性を突くコードが出回っているようです。

SeverityはMediumとやや低いものの、攻撃方法が確立されていて危険なためPriority Scoreが高くなったようです。

### CVSS Severityが High の脆弱性

fresh, negotiator で Regular Expression Denial of Service (ReDoS) = 正規表現DoS攻撃 の脆弱性が見つかりました。

また、qs でPrototype Override Protection Bypassの脆弱性が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/36ea75e2-19e0-1af4-8c87-cd9f1fb0a8a0.png)

これらの脆弱性には、`PRROF OF CONCEPT`がまだありません。
攻撃方法は確立していないようですね。

このため、Severityは高いものの、Priority Scoreがやや低くなったようです。

## コード解析: JavaScript

コード解析の結果、3個(H:1, M:2)の脆弱性が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/edf9f84a-18de-e37f-b2b8-480d0d8e29ac.png)

SeverityがHighの脆弱性だけを見てみます。

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/717d1edf-50d0-a130-0403-68129c35e320.png)

Server-Side Request Forgery (SSRF)という脆弱性が検出されました。

Server-Side Request Forgery (SSRF)ってなんやねん、という場合は`Learn about this type of vulnerability`をクリックすると解説サイトが開きます。

https://learn.snyk.io/lessons/ssrf-server-side-request-forgery/javascript/

解説サイトによると、要するに入力されたクエリパラメータ`req.query.url`をサニタイズせずにリクエストURL`url`に使用すると、通常はアクセスできないURLにアクセスできてしまう脆弱性です。

```bash
# https://meetr.com/user/image は外部公開されている脆弱性を含むサイト
# http://169.254.169.254/latest/meta-data/iam/security-credentials/Admin-Role は外部公開していない秘匿サイト
curl https://meetr.com/user/image?imgUrl=http://169.254.169.254/latest/meta-data/iam/security-credentials/Admin-Role
```

ためしに、Webアプリを起動してみると攻撃できてしまった（汗）ので、OSSコミュニティに連絡しました。

Snykすげー。

# まとめ

2つのプロジェクトを対象として、

1. C/C++の組み込みフレームワークのプロジェクト
1. Webアプリのプロジェクト

Snykで2つの脆弱性解析を実行しました。

* コード解析
* 依存関係解析

その結果、合計19個の脆弱性を発見し、

* C/C++の組み込みフレームワークのプロジェクト
    * コード解析: 2個(M:2)
    * 依存関係解析: 1個(H:1)
* Webアプリのプロジェクト
    * コード解析: 3個(H:1, M:2)
    * 依存関係解析: 13個(H:3, M:7, L:3)

Webアプリのコード解析の脆弱性がクリティカルだったので、OSSコミュニティに脆弱性を連絡しました。