Snyk を使って iOS プロジェクトのライブラリ脆弱性を検査する

# Snyk（スニーク）とは？

## 1. 概要

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/af6f7748-7c48-6d7c-93fd-fbd20406e270.png)

> Snyk（スニーク）はデベロッパーファーストのセキュリティプラットフォームです。Snykは、コードやオープンソースとその依存関係、コンテナやIaC(Infrastructure as a Code) における脆弱性を見つけるだけでなく、優先順位をつけて修正するためのツールです。Gitや統合開発環境（IDE）、CI/CDパイプラインに直接組み込むことができるので、デベロッパーが簡単に使うことができます。

（引用：https://qiita.com/advent-calendar/2021/snyk）

簡単にいうと**脆弱性を見つける**ためのツールです。

## 2. ロゴ

ロゴはマスコット犬で「**Patch(パッチ)**」という名前がついています。
（セキュリティホールを修正するプログラムを「パッチ」というので、その辺から命名されたのかな？とか思ったり）

![NFT](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/630916f3-8605-9d1f-c603-731fff5dc75a.png)

（引用：https://snyk.io/blog/snyk-6th-birthday-nft-gifts/）

最近だと NFT で出たりと運営側も結構気に入っているみたいです！笑

# iOSプロジェクトへの導入

## 1. Synkで出来ること

![synk for ios](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/7a261d7d-3e4c-8805-cc10-4f11ba400413.png)

iOSプロジェクトで使用する場合は、ライブラリの中身に脆弱性がないか確認してくれます。
現状は、**CocoaPodsのみ**に対応しているようです。


> We scan CocoaPods projects and examine your Podfile and Podfile.lock files. We then compare the specific versions of every direct and deep dependency in your project against our vulnerability database in order to build the project dependency tree accordingly.

> Swift and Objective-C projects managed by CocoaPods can be imported from any of the Git repositories we support. In order to test your projects, we analyze your Podfile and Podfile.lock files.

（引用：https://docs.snyk.io/products/snyk-open-source/language-and-package-manager-support/snyk-for-swift-and-objective-c-cocoapods ）

動作としては、プロジェクト内の`Podfile`と`Podfile.lock`からライブラリとバージョンを見て、`Snyk`が管理する独自データーベースと照らしあわせて検査するようです。この説明から、仕組み上は`Carthage`や`SPM`も使えそうですが、まだ対応していないということでしょう。

ちなみに独自のデーターベースは公開されています。

https://security.snyk.io/page/1?type=any


## 2. 導入していく

### ① 登録

まずは公式サイトから登録を行ってください。
登録方法は公式が書いたQiitaを見てください。

https://qiita.com/SnykSec/items/aa80a976eb17299fff62


### ② 検査する対象の選択

登録すると検査するリポジトリの対象を選ぶ画面になります。


![sy_ex12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/d2efd812-f04c-70cd-1595-958cf8ce079d.png)

``Github``/``Bitbucket``/``個別のリポジトリ`` の３つから選択可能です。
一番上の「Github」を選択するさらに詳細に設定を行えます。

#### ❶ リポジトリのアクセス範囲を選択

```
- リポジトリ全部（パブリック＆プライベート）
- リポジトリ全部（パブリックのみ）
```

どちらかを選択することができます。チームに所属している場合、そちらのリポジトリも対象になってしまうようなので、個別にリポジトリ設定する方がミニマムに行えて良いです。

#### ❷ 自動で動作するオプションの設定

細かい設定として自動的に以下のことも設定できます。

```
- [ ] 新しいプルリクエストをにつき、新しい脆弱性をテスト
- [ ] パッチ（脆弱性を修正する）プルリクエストの作成
- [ ] 古い依存関係をアップグレードするプルリクエストの作成
- [ ] ソースコードの脆弱性テスト （リポジトリのクローン、コードのアップロード。最大２４時間のキャッシュ。）
```

デフォルトですべてオンになっており、特に外す必要はないかと思います。

今回は１つ画面を戻って、個別のリポジトリ設定を選択していきます。

![sy_ex34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/a02b810f-4b49-8e13-2e34-140d3997b622.png)

色々と選択肢はありますが、iOSはないので、脆弱性をチェックしたいリポジトリのパスを自分で貼り付けます。

リポジトリを追加すると自動で `Snyk` のプロジェクトに追加され、以下のような画面に移動します。

![sy_pr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/aa3a4e4d-ef88-6602-06d7-b76a8a1cf5c0.png)

左側のタブで表示の設定などを切り替えることができます。
さらに中身を見てみると、脆弱性に問題がある場合は、詳細が表示されます。

![sy_pr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/7b5c428a-8a81-c6b8-e425-6fe0bc4afa40.png)

脆弱性にもスコアがあり、**スコアに応じてレベル分けがなされている**ようです。今回は、依存関係である`nanopb`が`325スコア`で`MEDIUMレベル`の脆弱性と判定されたようです。

**リポジトリを追加するだけ検査できる**のはとてもお手軽です！

## 3. 脆弱性のテスト

試しに脆弱性のあるライブラリを読み込んで、テストを行ってみました。データベースから`CocoaPods`で問題のあるライブラリを適当にピックアップします。

![demo library](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/91a5ee7f-8f99-c2a9-fa1c-cde9e9a2481a.png)

今回は`GPAC4iOS`というライブラリを入れてみます。

![gpac](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/8a4b6e1c-0a33-fa8f-719c-efda534dd712.png)



追加後は `pod install` して `Podfile.lock` を更新するのを忘れないでください。

そして、`Snyk`の管理画面を見てみると...

![res1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/e4ace099-8f1d-e88a-6951-9df33fc1812d.png)

見事に**脆弱性のレベルが増えてます**。中身を見ると

![re2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/7fe0f6c2-ec91-effb-bc91-5e2f4f51b32b.png)

このように詳細も見れました。

ちゃんと機能していることがわかり大変便利です！

# 終わりに

冒頭にも書きましたが、対応しているのが`CocoaPods`だけなのが残念ですが、`Carthage`や`SPM`も仕組み上は可能そうなので、`Github Actions`でこねくり回せばできなくはないように思います。

少し手間ではありますが、`Carthage`や`SPM`で提供されているライブラリは、大抵の場合は`Cocoapods`でも提供されているので、脆弱性をチェックするためだけのリポジトリを作っても良いかもしれません。