セキュリティを考える
Anthropic のソースコード流出や、Axios に対するサプライチェーン攻撃など、セキュリティが話題になる今日この頃。一度、Python を題材にキー・入力・依存関係の観点で掘り下げます。
次のスライドでは、生成AIがコードを書いてくれること自体のリスクと、実行環境ごとのイメージを共有します。
生成AIはコードを素早く出してくれますが、正しさや安全性は保証されません。「どこで動かすか」「何を信じるか」を意識しましょう。
ローカルでのみ実行 — 影響は主に自分のマシンに閉じる。ただしゼロではない
↓
閉域ネットワーク上で実行 — 社内・限定環境。漏洩や横展開の範囲が広がる
↓
Web 上にデプロイ — 不特定多数・常時接続。攻撃面・影響が大きくなりやすい
下に行くほど、想定外の損害が大きくなりやすい、というイメージです。
eval やシェル実行を鵜呑みにしないpip install するパッケージの名前・出所を軽く意識する
この心構えを踏まえ、今日は次のトピックを扱います。
eval の危険さを体感する(デモ用)requirements.txt などで依存を書き出す意味・重要性問題がある場合は、Slackのチャットでお知らせください。
キーは漏れる前提で制限・監視の設計を考えます。コードに直書きせず、環境変数や .env(.gitignore に含める)、CI では GitHub Secrets などで渡します。
os.environ["API_KEY"]).env と .gitignore、リポジトリには載せないプロバイダ側でキーに最小権限(使う API だけ)を付けられる場合は、それに合わせましょう。
事前に pip install openai を実行し、環境変数 API_KEY を設定してから動かします。
Web のフォームや input() で受け取った文字列は、信頼しないのが基本です。LLM アプリでは、ユーザー入力がシステム側の指示をねじる攻撃をプロンプトインジェクションと呼びます。
対策は一発ではありませんが、入力の検証・役割の分離・テンプレート化など、設計として意識することが第一歩です。
eval の危険さ(デモ)ユーザー入力を eval に渡すと、任意の Python 式が実行されます。実運用では使いません。ローカルで挙動だけ確認する想定です。
eval は式評価であり、悪意のある入力で処理系そのものが乗っ取られる
requirements で依存を管理する意味手元で pip install パッケージ するだけでは、「いつ・誰が・どのバージョンを入れたか」がプロジェクトに残りません。requirements.txt(や poetry.lock / uv.lock など)に依存関係を書き出して共有することで、チームと CI・本番が同じ前提を持てます。
次のスライド以降は、この「一覧」をどう保護・点検するか(Snyk、バージョン固定、プロキシなど)につながります。
PyPI のパッケージにも脆弱性はあります。リポジトリと Snyk を連携しておくと、無料枠でも深刻度の把握や修正 PR まで進めやすくなります。
先ほどのように依存をファイルに書いたうえで、バージョンを固定(ピン留め)すると、意図しない更新や「いつの間にか変わった挙動」を抑えられます。新しく出たパッケージは少し様子を見る、という姿勢も有効です。
今日は生成AIのコードの扱いと実行環境のイメージを共有したうえで、APIキー(プロジェクト単位・環境変数・ローテーション)→ 入力とプロンプトインジェクション → eval の危険性 → 依存の明示(requirements)→ Snyk とバージョン固定・サプライチェーンを扱いました。
eval のような「全部実行」系は実装に使わないrequirements などで明示し、固定・スキャン・新規パッケージは慎重に質問や「うちのプロジェクトだとこうかも」があれば、時間の範囲で共有しましょう。