アンチパターン⑭「古いライブラリ推奨」
AI生成コードの脆弱性:トレーニングデータの呪い
AIには、根本的な問題があります。
“AI code assistants often return code using outdated versions—like requests==2.25.1, a version released in 2021 with known security vulnerabilities and no longer receiving patches.”
AIはトレーニングデータに含まれる 古いライブラリ を推奨する傾向があります。
なぜ古いライブラリを推奨するのか
AIが古いライブラリを推奨する理由があります。
理由1: トレーニングデータのカットオフ
- AIは特定の時点までのデータで訓練
- 新しいライブラリやバージョンを知らない
理由2: 統計パターンに基づく予測
- 多く使われている(た)バージョンを推奨
- 古いチュートリアルやStack Overflowの回答を学習
理由3: 「最新」という概念がない
- AIはバージョンの新旧を理解していない
- 「セキュリティパッチ」の概念がない
AI生成コードがStack Overflowの脆弱性を引き継ぐ
興味深い指摘があります。
“Stack Overflow itself has a copy-and-paste problem—‘the most copied and pasted piece of code from Stack Overflow had security flaws in it, and this was making it into enterprise code bases.’”
Stack Overflowの「コピペ問題」は、AIを通じてさらに拡大しています。
問題の連鎖:
1. 2015年にStack Overflowに回答投稿
(当時は正しかったが、今は脆弱)
2. AIがその回答を学習
3. 2025年にAIが同じコードを推奨
4. 開発者がそのまま使用
5. 既知の脆弱性がプロダクションに
【要注意】典型的な危険コードパターン
AIが推奨しがちな古いライブラリの例を見てみましょう。
Python:
# ❌ AIが推奨するかもしれない古いバージョン
pip install requests==2.25.1 # 2021年、脆弱性あり
pip install django==2.2.0 # 2019年、サポート終了
pip install flask==1.1.0 # 2019年
# ✅ 最新の安定版を使用
pip install requests>=2.31.0
pip install django>=4.2
pip install flask>=3.0
JavaScript:
// ❌ 古いバージョン
"dependencies": {
"lodash": "4.17.15", // 2020年、脆弱性あり
"axios": "0.21.0", // 2020年
"express": "4.17.1" // 2019年
}
// ✅ 最新版
"dependencies": {
"lodash": "^4.17.21",
"axios": "^1.6.0",
"express": "^4.18.2"
}
既知の脆弱性の危険性
古いライブラリには、既知の脆弱性(CVE) が含まれていることがあります。
問題:
-
CVEが公開されている
- 攻撃方法が詳細に文書化
- 攻撃ツールが存在
-
パッチがリリースされている
- 脆弱なコードと修正コードの差分が公開
- 攻撃者は何を狙えばいいか明確
-
自動スキャンで検出される
- 攻撃者も脆弱性スキャナを使用
- 簡単にターゲットを発見
実践的な解決策:最新版の使用
古いライブラリを避けるための対策を解説します。
実践的な解決策1: 常に最新版を指定
// package.json
{
"dependencies": {
"express": "^4.18.2", // セマンティックバージョニング
"lodash": "^4.17.21"
}
}
# pyproject.toml
[project]
dependencies = [
"requests>=2.31.0",
"django>=4.2,<5.0",
]
実践的な解決策2: Dependabotの設定
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
open-pull-requests-limit: 10
security-updates-only: true
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
実践的な解決策3: 脆弱性スキャン
# npm
npm audit
npm audit fix
# Python
pip-audit
safety check
# 汎用
snyk test
実践的な解決策4: CIでの自動チェック
# GitHub Actions
name: Security Scan
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npm audit --audit-level=high
プロンプトによるセキュリティ対策
AIにライブラリの使用を依頼する際のプロンプト例です。
良いプロンプト:
Express.jsでAPIサーバーを作って:
## ライブラリ要件
- 最新の安定版を使用
- 既知の脆弱性がないバージョン
- 2024年以降にリリースされたバージョン
## AI開発で避けるべき禁止事項
- 古いバージョンの使用
- サポート終了したパッケージ
- 脆弱性が報告されているバージョン
バージョン管理のベストプラクティス
ライブラリのバージョン管理について解説します。
セマンティックバージョニング
MAJOR.MINOR.PATCH
^2.31.0 = 2.x.x の最新
~2.31.0 = 2.31.x の最新
2.31.0 = 固定
ロックファイルの活用
# npm: package-lock.json
npm ci # ロックファイルに従ってインストール
# pip: requirements.txt をフリーズ
pip freeze > requirements.txt
# Poetry: poetry.lock
poetry install
定期的な更新
# npm
npm update
npm outdated
# pip
pip list --outdated
pip install --upgrade package-name
実装前チェックリスト
古いライブラリ対策のチェックリストです。
開発時:
- 最新の安定版を指定しているか
-
npm audit/pip-auditを実行したか - ロックファイルをコミットしているか
CI/CD:
- Dependabotを設定しているか
- 脆弱性スキャンを自動実行しているか
- 脆弱性が検出されたらビルドを失敗させているか
定期メンテナンス:
- 週次で依存関係を確認しているか
- セキュリティアドバイザリを監視しているか
- サポート終了予定を把握しているか
この事例から学ぶべき教訓と実践ポイント
「古いライブラリ推奨」から学ぶべきことは以下の通りです。
-
AIは古いバージョンを推奨しがち
- トレーニングデータのカットオフ
-
既知の脆弱性が含まれる
- CVEが公開されている
-
最新版を使用
- セマンティックバージョニング
-
自動スキャンを導入
- npm audit、Dependabot
-
定期的な更新
- 週次での確認
まとめ:重要ポイントの振り返り
- AIは 古いライブラリバージョン を推奨しがち
- 古いライブラリには 既知の脆弱性(CVE) が含まれる
- Stack Overflowの問題が AIを通じて拡大
- 解決策:最新版使用、Dependabot、脆弱性スキャン
- ロックファイル をコミット、CIで自動チェック
- プロンプトで 「最新版を使用」を明示
- 教訓:AIが推奨するバージョンを盲信するな