依存ライブラリとは何か
依存ライブラリとは、自分のプログラムが借りて使っている、他の人が作った部品のことです。部品に既知の弱点があれば、自分のコードが正しくても、プログラムは攻撃されます。
大学のレポート提出アプリを考えます。使っているPDFの部品が1つ古いだけで、提出された1枚のファイルから、サーバーが乗っ取られることがあります。
このレッスンのゴール
メモ
使っている部品の一覧を見て、古いものと、コードに残った秘密を見つけられる。
今日のキーワード
| ことば | いみ | れい |
|---|---|---|
| 依存関係 | 自分のプログラムが使っている部品の関係です。 | |
| 推移的依存 | 部品が使っている、さらに奥の部品です。 | |
| バージョン | 部品の版を表す番号です。 | 1.4.2 |
| 脆弱性 | 攻撃に使える、プログラムの弱点です。 | |
| ロックファイル | 使うバージョンを1つずつ書き止めたファイルです。 | |
| 秘密情報 | 鍵やパスワードなど、知られてはいけない文字です。 |
学生が入力するセルは、このプレビューでは空白です。
たった1つのルール
注意
見てよいのは、自分専用のラボのコピーだけです。このラボは、わざと秘密を悪い場所に置いたアプリで、インターネットにはつながっていません。許可のない他人のシステムに同じことをするのは、不正アクセス禁止法に触れる犯罪です。
部品は何段にもつながっている
プログラムは、自分が選んだ部品と、その部品が使う部品でできています。自分が選んだ部品が 直接の依存、その奥の部品が 推移的依存(transitive dependency)です。
自分の一覧に書いていない部品も、プログラムの中で動いています。奥の部品の弱点も、自分の弱点です。
バージョンで古い部品を見つける
バージョンは「主.副.修正」の3つの数で書きます。1.4.2 は、主が1、副が4、修正が2です。弱点が見つかると、直したバージョンが公開されます。
自分のバージョンが、直したバージョンより古いかを調べます。比べるときは、文字ではなく、数として比べます。
文字と数で比べる
# 文字として比べると、"4" が "1" より大きいので、順番が逆になります。
print("1.4.2" < "1.10.0")
def parse(version):
parts = []
for piece in version.split("."):
parts.append(int(piece))
return parts
# 数のリストにすると、正しく比べられます。
print(parse("1.4.2") < parse("1.10.0"))
print(parse("2.3.1") < parse("2.3.5"))
例: 3つの部品を判定する
| 部品 | 使っている版 | 直した版 | 判定 |
|---|---|---|---|
| pdf-maker | 2.3.1 | 2.3.5 | 古い。更新する |
| csv-tools | 1.10.0 | 1.4.2 | 新しい。そのままでよい |
| mail-send | 4.1.0 | 4.1.0 | ちょうど直した版。そのままでよい |
学生が入力するセルは、このプレビューでは空白です。
版を固定して、決まった時に更新する
ロックファイルは、使うバージョンを1つずつ書き止めます。誰がいつ作っても、同じ版が入ります。版を書かない部品は、ある日、知らない版に変わります。
固定したら終わりではありません。弱点の知らせを見て、決まった頃に更新します。
秘密をコードに置かない
部品のほかに、もう1つの落とし穴があります。コードや設定の中に、パスワードや鍵を書いてしまうことです。
一度でも共有したコードは、消しても履歴に残ります。秘密は、コードの外の、鍵を管理する仕組みや環境変数に置きます。
設定の文字を探して読む
ラボを起動して、次の2つを実行しましょう。どちらも見るだけです。1つ目は、3行の設定の文字から、key を含む行を探します。
2つ目は、ラボのアプリが動いているかを、決まった住所に問い合わせます。アプリの中の秘密を探すのは、ラボの課題です。
設定の中の key の行
printf 'host = db\napi_key = "abc123"\ndebug = true\n' | grep -n keyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ラボのアプリは動いているか
curl -s -o /dev/null -w "%{http_code}\n" http://wrongsecrets:8080/actuator/healthここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2つの答えを読む
1つ目は、行番号 2 のあとに、api_key = "abc123" の行を表示します。ファイルの中の文字を機械で探すと、秘密が一瞬で見つかります。
攻撃する人も、同じ道具を使います。2つ目は 200 を表示します。アプリが正常に動いている印です。
よくある間違い
注意
「ファイルから秘密を消せば、秘密は消える」と考える人がいます。それは違います。共有したコードの履歴には、消す前の版が残っています。漏れた秘密は、消すのではなく、新しいものに取り替えます。