記事一覧へ English

Internet of Tomohiro

よろしければ投げ銭をお願いします。


Google Colaboratoryで見つけたセキュリティ問題について

一か月前頃に Google ColaboratoryOpenSSH serverに関係するセキュリティ問題を見つけてGoogleに報告しました。 おかげでBughunterのHonorable Mentionsに載りました!

https://bughunter.withgoogle.com/profile/d9c76300-d251-4f1d-988a-49abcc06b809

今はその問題は修正されています。 この問題は Google Colaboratory で割り当てられる仮想マシン上で OpenSSH serverを立ち上げてインターネットからログインできるようにした場合に関係してきます。 Google Colaboratory のユーザの殆どはそのようなことはしないと思うのですが、 以前にその方法を記事に書きましたし、 インターネット上でそのような話題が見かけられれます。 このようなSSHからGoogle Colaboratoryにログインするためのコードも公開されています。

https://gist.github.com/creotiv/d091515703672ec0bf1a6271336806f0


ところで、このコードではPythonのrandomモジュールからパスワードを生成していますがそのモジュールはセキュリティや暗号学的に設計されてはいません。secretsモジュールを使ってパスワードを生成すべきです。詳しくは以下のリンクを参照してください。 https://docs.python.org/ja/3/library/secrets.html


問題を見つけたときにはGoogle Colaboratoryの仮想マシンにOpenSSH serverがデフォルトでインストールされていました。 下記のファイルはSSHサーバが認証に使用するprivate host keyで、サーバ毎にユニークで秘密になっている必要があります。

/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_rsa_key

Colaboratoryでコードセルを追加して以下のコードを実行すると中身を見ることができました。

!cat /etc/ssh/ssh_host_ecdsa_key
!cat /etc/ssh/ssh_host_ed25519_key
!cat /etc/ssh/ssh_host_rsa_key

問題だったのはこれらのprivate host keyが常に同じ内容だった事です。 ランタイムをリセット、ランタイムタイプを変更、別のアカウントでログインするなどしてもファイルの中身が変わることがありませんでした。 つまりColaboratoryで使われるすべての仮想マシンでこれらのファイルが同じ内容だったのです。 秘密にすべきファイルが秘密になっていないということです。 以下のサイトでこのキーが攻撃者に知られると中間者攻撃が可能になることが説明されています。

今はopenssh-serverパッケージがインストールされなくなったので問題は解決しました。 private host keyはopenssh-serverインストール時に生成されるので、各ユーザが個別にインストールすればランダムでユニークな値になるはずです。 そもそも何故openssh-serverがデフォルトでインストールされていたかは謎です。

マシンに必要なプログラムをインストールした後にシステム全体を一つのimageファイルとして保存し、後で同じシステムを持ったマシンを簡単に作れるようにすることがあると思います。 SSHサーバインストール時にprivate host keyが生成され、そのファイルを消さずにimageファイルを作り、さらにそのimageファイルを公開したら同様の問題が起こることになります。 imageファイルを秘密にしておくか、imageファイルを作る前にprivate host keyを消しましょう。


by Tomohiro

記事一覧へ