はじめてのOSSコントリビューション with Snyk

### メリークリスマスイブ！

こちらは『Snykを使ってコードをセキュアにした記事を投稿しよう！ by Snyk Advent Calendar 2023』24日目の記事です。

https://qiita.com/advent-calendar/2023/snyk

## OSS（オープンソースソフトウェア）とは

OSS、つまりオープンソースソフトウェア (Open Source Software)とは、ソフトウェアのソースコードが公開され、利用や改変、再配布を行うことが誰に対しても許可されているソフトウェアです。

たとえばOSだとLinux、プログラミング言語のPerl、ブラウザのfirefoxがOSSです。

最近知ったものだと、TRPGセッションツールの[ユドナリウム](https://github.com/TK11235/udonarium)なんかがオープンソースです。
(マダミナリウムというユドナリウムの派生を教えてもらって、初めて知りました)

再配布の許可は必須なのか？
イマイチよく分からないな、なんか定義あるのかな、と思って探していたら、
OSSを管理しているOpen Source Initiativeという団体が「OSSとはなにか」という定義をしていました。

https://opensource.org/

10個挙げられていますが、3つ目に、派生著作物に関する条項があります。

>３. 派生著作物
ライセンスでは、修正および派生作品を許可する必要があり、元のソフトウェアのライセンスと同じ条件の下でそれらを配布できるようにする必要があります。

（＊日本語訳したものです。）

ただソースを公開（オープン）しているだけではオープンソースには足りないようですね。

とはいえ、お仕事としてライセンスをじっくり読んで対応しないとまずそうなときはともかく、日常ではもうすこし広義で使われている気がします。

どうしてわざわざそんなことをしてくれるのかというと、ハッカー倫理[^1]にもとづいたものであるとか、OSSにした方が独占しているよりもいいとか、企業としてもちょっと維持できなくなっちゃったからいっそOSSにして開放しますとか、いろいろあるようです。

まあ、信じられないくらい面白いゲームがフリーゲームとして公開されている世の中ですからね。

OSSも、全てにおいて良いことばかりでもないようで、「金を払ってくれてねぇのに早急にメンテしろって言いやがって……」みたいな恨み節もしばしば聞きます。維持し続けるのが負担になり、手を引く開発者さんがいらっしゃったりします。

### OSS活動をしてみたい

OSS活動というのは、OSSの開発・保守に貢献する活動のことです。
ボランティアに参加することで、日ごろお世話になっているソフトウェアの発展に貢献できるというわけですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/477d31a9-0695-e2a7-4d43-7ed2cab6f0eb.png)

プロジェクトにコミットすることで、Githubに草を生やすことができます[^2]。

人によっては会社でランチの傍らにOSSにコミットメント。コントリビューション。「ふぅ、また世界を救ってしまったな……」とやっている**気がします**。

残念ながら、私は今までにOSS活動をやったことがありません。
OSS活動、やってみたい……っ。

べつに高尚な意欲があるわけではなく、**いつか[Hacktoberfest](https://hacktoberfest.com/
)に参加してTシャツが欲しい**、と思っていたら、報酬がデジタルバッジになってしまったみたいです。

**ああ、「大した技術は持ってないし、立派な人間になってから」とか思っている間に、OSS活動をしていたら、よかった！！！**

**よかったんだよ～～～！！！**

というわけで、後悔しないように、ここはひとつ、やってみようということです……。

## Snyk(スニーク)とは

https://go.snyk.io/jp.html

Snykは、Githubのリポジトリを検査して、脆弱性を発見することができるツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/906ca36d-0959-f068-c9d7-ee32eabc7dc1.png)

**マスコットキャラクターのパッチ君が非常にいい。いいよね。**

無料プランがあって、個人開発者であっても気軽に試すことが出来そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/88926126-38e7-c5ff-5290-ebb99a73d014.png)

Githubと連携するとすぐさまアカウントが作れて、リポジトリを選択するとコードがスキャンできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/8aa889e7-634a-0734-8663-be146f26a49d.png)

このように、公開リポジトリであればスキャンすることができます。
（スキャンするだけで、別に勝手にアプリをインストールしてるわけではないので、相手先に迷惑は掛からないはずです。）

さて、これでさくっと脆弱性を検査して、うまいことプルリクエストを送ることが出来たらもしかしたら気軽にOSS活動ができるのではないでしょうか？

## とりあえずやってみる

私は、いまのところ、サーバーと連携するようなアプリは公開しておりません。
脆弱性があってもせいぜいがメモリリークくらいで、誰かに迷惑をかけるようなことはないのではないかと思っていましたが、いくらか警告がでました。

High相当の警告です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/e715eeb9-0392-7ac6-395d-dbd61d15fc42.png)

>Unsanitized input from a web form flows into global::System.IO.File.Exists, where it is used as a path. This may result in a Path Traversal vulnerability and allow an attacker to obtain information about arbitrary files.

「このファイルパスに悪意のある文字列を詰め込まれたりしない？　大丈夫？」ってことらしいです。

**このソフトはデスクトップ上で動くソフトで、フォームといってもWebのフォームではない。パスを詰め込むのは私（か使ってる人）なんで、大丈夫です。**

## Snyk(スニーク)でOSSのリポジトリをスキャン

ということで、いろいろな（とくに、自分がお世話になっている）パブリックリポジトリと連携してどうなるか見てみました。

### misskey

たとえば分散型SNS、[miskky](https://github.com/misskey-dev/misskey)なんかどうでしょう？
ちょっぴりお世話になっていますし、開発も活発そうで、お試しにちょうどよさそうです。

（勝手に）misskeyのパブリックリポジトリを追加して検査してみると、いくつか警告が出ていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/5b0f66f4-60ee-0116-93a1-7962fafa725e.png)

ただし、さっき自分のリポジトリでやってみたように、よく見てみると**直す必要があるものであるとは限りません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/2e9881f4-f5c1-2e4a-942b-20dc38a311ff.png)

いっこだけあるHighは、この「正規表現に好き勝手な文字を入れられたらやばくねぇ？」みたいな警告でしたが、前後を見てみると、この正規表現はユーザーが入力するものではなさそうです。

また、直す必要があったとしても、全体を把握していないと修正が出来なさそうなところもたくさんあります。

自分の手元で環境が作れて、自分の手元でビルドが通ることを確認して、直ったらGOというのが理想ですが、問題を把握し、再現性のある現象が起こせたらissureを立てるだけでも役に立てるはずです。
（例えば正規表現がユーザー入力の部分であったら試してみて、報告するなど）

### ユドナリウム

次に、オンラインセッションツールである[ユドナリウム](https://github.com/TK11235/udonarium)を見てみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/7af9d60e-e51a-68e5-8a11-5c27a6bc2d56.png)

これはバージョン依存関係の脆弱性のようです。
skyway-sdk/coreのバージョン1.6.1に使用されているライブラリ、に使用されているライブラリ、axiosのバージョンが古いと言っているようです。
調べてみると、確かに新しいバージョンがありそうなのですが、ちょっと依存関係が複雑です。
さらにはSkyWayには新バージョンが出てて、ユドナリウムも移行のための試行錯誤をしているようです。
（っていうか、ユドナリウムは、NTTのビデオ通話のライブラリを使っていたんだね～！）

ちょっと私の手に余りそうだ……。

ただ、いいことには、Snykでは、「ライブラリが古いので、新しいバージョンを使ってね」という脆弱性が検知できるようです。

私でも、「ライブラリが古くなっているので、バージョンを新しくしよう」程度のプルリクはできるのではないでしょうか。

### 修正できそうな公開リポジトリを探すこと、１時間……。

***あったーーー！！！***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/7c930559-7b87-ab69-f7cb-dada01d6286c.png)

この警告であれば、私でも理解できます。
「Dockerで使用されているrequirements.txtで、opencv-pythonというライブラリに使用されているバージョンが古くって、そっちには重大な脆弱性があったので、バージョンをあげてください」です。

単にバージョンを変更するだけなので……。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/0ad524b6-a166-4d17-7bda-90f6ea371ff2.png)

こうなります。

**Snykを用いて、パブリックリポジトリの脆弱性を見つけ、プルリクすることが可能です。**

## オチ…

ただ、注意をよく読んでみると、この脆弱性は、**ReadHuffmanCodes()関数**を使用していなければ害がないようです。
しかも、どうやら、**color_cache_bitsを使用するサイズが値で定義されている場合にのみ**悪用可能です。

……。

間違っちゃあいないといえばいないんですが、開発者の人からしてみれば、あまり嬉しくはない修正ですね。
（ので、これについてはforkして、手元でコミットして、プルリクを出す手前までやりました。規模が大きいものだったらいくらか意義があると思ったんですが、ほんとうに小規模な個人開発のものだったので……）

Snykは、ツールとしては（忖度なしに）かなり使いやすかったです。

Web上で動いてくれるので、アプリのインストール不要で、
過剰な広告もめんどくさい手続きもない……。
悪さもしなさそうなので、「とりあえずウイルス対策ソフト動かしとくか～」くらいのノリで入れておいても損はしない気がします。

Snykで検出されたエラーには、どうしてそうなるのか・どうしたらいいのかというような丁寧な解説のリンクがあって、公開リポジトリをいろいろと見て回って、ちょっとセキュリティに詳しくなったような気がします。

[Regular Expression Denial of Service (ReDoS)](https://learn.snyk.io/lesson/redos/?authenticate=automatic&_gl=1*1cpgg7f*_ga*Njk3ODUzNTg4LjE3MDI3ODcxNzc.*_ga_X9SH3KP7B4*MTcwMzM0NDEwMi41LjEuMTcwMzM1MjY5NC4wLjAuMA..)、初めて知りました。

公開リポジトリを探し回るのも楽しかったです。

バグを見つけて、それが報告されているかどうか見て、issue立てるだけでもありがたい、はず！

コードの修正がおっかなかったら、初心者が手っ取り早く貢献できるプルリクが、ドキュメントの翻訳なんかも、なかなか手の回らないところだと思います。
次の目標は、BCDiceでちょっとマニアックなTRPGのダイスに対する修正をすることです。

## ところで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/2b38a85b-ff54-1c8b-de3d-43b90a247b1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663038/906ca36d-0959-f068-c9d7-ee32eabc7dc1.png)

パッチくん、サイコーにいいよな……。

### 参考文献・URLなど

- [Snyk公式](https://go.snyk.io/jp.html)
- [OpenSourceInitiative](https://opensource.org/)
- [Firefox ユーザーの権利について](https://www.mozilla.org/ja/about/legal/terms/firefox/)
- [misskey(githubリポジトリ)](https://github.com/misskey-dev/misskey)
- [ユドナリウム(githubリポジトリ)](https://github.com/TK11235/udonarium)
- [Skyway 公式ドキュメント](https://webrtc.ecl.ntt.com/documents/javascript-sdk.html)

[^1]:「ハッカーとは本来、コンピューターやネットワークについて高度な知識や技術を持つ人々を意味する」ということで、ここではあまり悪い意味ではない。
Steven Levyの提唱したハッカー倫理(Hacker Ethics)の条項には、All information should be free.（すべての情報は自由であるべき）というものがある。
[Eset ハッカーとクラッカーの違いとは？ホワイト？ブラック？何が違うのか](https://eset-info.canon-its.jp/malware_info/special/detail/230214.html)

[^2]:Githubで活動しているとマス目が緑になるが、それを「草を生やす」と呼称する。そんなに面白おかしいという意味はない。