クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

依存ライブラリの安全確認

このレッスンのあとで: 使っている部品の一覧を見て、古いものと、コードに残った秘密を見つけられる。

55分のレッスンコマンド2件WrongSecrets のラボ:埋め込まれた秘密情報を見つけ、保管の正しい場所を学ぶ

依存ライブラリとは何か

依存ライブラリとは、自分のプログラムが借りて使っている、他の人が作った部品のことです。部品に既知の弱点があれば、自分のコードが正しくても、プログラムは攻撃されます。

大学のレポート提出アプリを考えます。使っているPDFの部品が1つ古いだけで、提出された1枚のファイルから、サーバーが乗っ取られることがあります。

このレッスンのゴール

メモ

使っている部品の一覧を見て、古いものと、コードに残った秘密を見つけられる。

今日のキーワード

ことばいみれい
依存関係自分のプログラムが使っている部品の関係です。
推移的依存部品が使っている、さらに奥の部品です。
バージョン部品の版を表す番号です。1.4.2
脆弱性攻撃に使える、プログラムの弱点です。
ロックファイル使うバージョンを1つずつ書き止めたファイルです。
秘密情報鍵やパスワードなど、知られてはいけない文字です。

学生が入力するセルは、このプレビューでは空白です。

たった1つのルール

注意

見てよいのは、自分専用のラボのコピーだけです。このラボは、わざと秘密を悪い場所に置いたアプリで、インターネットにはつながっていません。許可のない他人のシステムに同じことをするのは、不正アクセス禁止法に触れる犯罪です。

部品は何段にもつながっている

プログラムは、自分が選んだ部品と、その部品が使う部品でできています。自分が選んだ部品が 直接の依存、その奥の部品が 推移的依存(transitive dependency)です。

自分の一覧に書いていない部品も、プログラムの中で動いています。奥の部品の弱点も、自分の弱点です。

バージョンで古い部品を見つける

バージョンは「主.副.修正」の3つの数で書きます。1.4.2 は、主が1、副が4、修正が2です。弱点が見つかると、直したバージョンが公開されます。

自分のバージョンが、直したバージョンより古いかを調べます。比べるときは、文字ではなく、数として比べます。

文字と数で比べる

コード: python
# 文字として比べると、"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-maker2.3.12.3.5古い。更新する
csv-tools1.10.01.4.2新しい。そのままでよい
mail-send4.1.04.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 を表示します。アプリが正常に動いている印です。

よくある間違い

注意

「ファイルから秘密を消せば、秘密は消える」と考える人がいます。それは違います。共有したコードの履歴には、消す前の版が残っています。漏れた秘密は、消すのではなく、新しいものに取り替えます。

このラボとソースについて: WrongSecrets のラボ:埋め込まれた秘密情報を見つけ、保管の正しい場所を学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。