はじめに
サイバーセキュリティ推進部の吉田です。普段は、CSIRTメンバーとしてAWS環境や各種端末のモニタリング、セキュリティインシデント対応、社内からのサイバーセキュリティに関する相談対応などの業務を行っています。
2023/05/10 追記
GitHubのアップデートによって、プライベートリポジトリのIssueやPull Requestsに新たにアップロードされたファイルは、権限を持たない外部からは参照できなくなったようです。詳細につきましては、以下のGitHubのブログをご確認ください。
https://github.blog/changelog/2023-05-09-more-secure-private-attachments/
概要
GitHubのIssueやPull requestsに添付した画像はWebにアップロードされ、パブリックなURLが割り当てられます。このURLは外部に対して公開されており、そのリポジトリがPrivateであったとしても誰でも自由にアクセスが可能です。このことから弊社では、IssueやPull requestsへの画像アップロードはルールとして禁止されているのですが、今回私がルールを正しく理解せずに画像をアップロードしてしまったため、その削除対応として行ったことをまとめる、というのが今回の記事の趣旨です。
事象
GitHubでIssueを作成しメンバーにそのレビューを依頼したところ「Issueに画像添付するのは社内ルール違反だよ」と指摘を受けました。社内のGitHub利用ルールのドキュメントを確認したところ、以下の記述がありました。
Issue/Pull requestsへの画像添付は禁止
URLがアクセス権限を必要とせず時限でもなく、URLがわかると外部からアクセスできてしまうため
社内のGitHub利用ルールに抵触しており、アップロードした画像が外部からアクセスされる可能性があることを改めて理解し、アップロードした画像の削除を行わなければならないと判断しました。
対応
公式ドキュメントの確認
まずはGitHubの公式ドキュメントから「IssueやPull requestsに添付した画像の削除」について調べてみたところ、アップロードしたファイルのURLの公開についての注意は記載されていましたが、アップロードしたファイルの削除については見受けられませんでした。アップロードしたファイルのホストにはオープンソースプロジェクトであるatmos/camoが専用のURLを発行する仕組みとして利用されているようです。この専用URLについて、公式ドキュメントには「anonymized URLs」と記載されており直訳すると「匿名化されたURL」となります。これは発行されたURLから画像をアップロードしたアカウントが特定できないようになっている、という意味だと見受けられます。
・Attaching files
Warning: When you upload a file to a pull request, issue comment, or ticket in the GitHub Support portal, anyone can view the anonymized URL without authentication, even if the pull request is in a private repository. To keep sensitive media files private, serve them from a private network or server that requires authentication. For more information on anonymized URLs see "About anonymized URLs".
・atmos/camo
削除方法の調査
公式ドキュメントに添付画像の削除手順が見受けられなかったため、Webで調査してみたところ、以下のフォーラムに行き当たりました。要約すると、GitHub Supportに依頼するしかないとのことです。
・github: how do I delete an attachment in github issues?
https://stackoverflow.com/questions/33215211/github-how-do-i-delete-an-attachment-in-github-issues
GitHub Supportに依頼する
GitHub Supportにアップロードした画像の削除を依頼してみます。GitHub Support ポータルへとアクセスして今回の事象に該当する選択肢をクリックしていきました。そうすると、Virtual Assistantが起動して「削除しようとしている画像の URL は何か?」と聞かれたため当該URLを返信したところ、サポートチケットが起票されました。その後1時間ほどで「その画像を削除したよ。変更を確認するには、ブラウザのキャッシュをクリアしてから確認してね」とサポート窓口から返信があり、手元でも画像URLにアクセスできないことを確認しました。
・Github Support ポータル
https://support.github.com/request?tags=docs-generic
まとめ
実は今回Issueに添付した画像は公開情報であったため、万が一そのURLに対して外部からアクセスがあったとしても、情報流出には該当せず脅威はありませんでした。しかしながら、アップロードした画像が機密情報であった場合には、セキュリティインシデントとなる可能性があります。このことから社内ルールの見落としには注意しなければならないと、改めて考え直す機会になりました。
一点だけ補足しておきます。今回は本人がアップロードしたファイルの削除をサポートに依頼したため、すぐに依頼は受領されファイルは削除されました。しかしながら、他者が自身の管理するリポジトリ/organizationのIssueやPull requestsに添付した画像を削除したい場合には、サポートとの複数回のやり取りが必要となるようです。これは自身の管理するリポジトリ/organizationであっても、画像をアップロードしたユーザー側に権利が帰属するといったことかもしれません。organization内にアップロードされている画像を一括で削除したいと考えているGitHub管理者の方はご注意ください。
また、Enterprise版のServerとしての利用であれば、画像添付時のアップロード先サーバを自前で準備して認証認可の仕組みを持たせることで、外部に公開されないようにすることが可能のようです。
・About anonymized URLs
If an image is being served from a private network or from a server that requires authentication, it can't be viewed by GitHub. In fact, it can't be viewed by any user without asking them to log into the server.
To fix this, please move the image to a service that is publicly available.
最後に
ここまで読んでいただいてありがとうございました。私が確認した限りでは公式ドキュメントにも本対応における手順などが見受けられなかったため、失敗談ではありますが記事としてまとめてみました。どなたかのお役に立てば嬉しく思います。
さて、コインチェックでは、サイバーセキュリティ推進部で一緒に働くメンバーを募集しています。サイバーセキュリティ推進部では、暗号資産販売所におけるセキュリティ対策の推進に携わることができ、個人に与えられる裁量が大きいことから、自身で手を挙げてプロジェクトを推進していける方であれば、より大きく成長できる機会を得ることができます。少しでも気になった方は応募していただけると嬉しいです。