今回はWeb Security Academyの「Low-level logic flaw」ラボをもとに、ECサイトの購入処理に潜むロジックの欠陥を解説します。
このラボでは、商品の数量を大量に追加することで価格計算が壊れ、商品を意図しない価格で購入できてしまうという問題が発生します。
一見すると単純なショッピング機能ですが、計算処理の設計ミスがあると、価格がマイナスになってしまうことがあります。
これはECサイトでは非常に危険な脆弱性です。
WSA「Low-level logic flaw」ラボの概要
このラボでは、ストアクレジット(購入に使える残高)が $100 しかない状態で、高額商品を購入できてしまいます。
ターゲット商品は次です。
Lightweight l33t leather jacket
この商品は$1337と非常に高価なので、本来なら購入できません。
しかし、カートに商品を大量に追加すると、途中で合計価格が突然マイナスになる現象が起きます。
その状態を利用すると、残高が少なくても注文が通ってしまいます。
ECサイトの価格を壊す攻撃の流れ(Low-level logic flaw)
攻撃者は、商品数量を異常な回数追加して価格計算を壊します。
商品をカートに追加
↓
大量の数量を送信
↓
合計価格が整数の最大値を超える
↓
価格がマイナスに変化
↓
残高以内の価格になる
↓
注文が成立
この攻撃では、価格そのものを改ざんしているわけではありません。
あくまで「大量注文」という操作だけで、システムの計算が壊れてしまっています。
なぜECサイトの価格がマイナスになるのか|整数オーバーフローの仕組み
このラボでは、商品を大量にカートに追加すると、合計価格が突然マイナスになるという不思議な現象が起きます。
原因は、プログラムの整数オーバーフロー(Integer Overflow)です。
コンピュータで数値を扱うとき、数値には保存できる最大値があります。
例えば、32bitの整数では、次の値が上限になります。
2,147,483,647
通常は、商品の価格やカートの合計金額もこのような整数で計算されています。
しかし、この上限を超える数値が計算されると、エラーになるのではなく数値がマイナス側に戻ってしまうことがあります。
2,147,483,647
↓
-2,147,483,648
この現象を「整数オーバーフロー」と呼びます。
今回のラボでは、商品の数量を何度も追加することで、カートの合計金額がこの上限を超えてしまいます。
その結果、合計金額がマイナスになり、本来は購入できない商品でも注文が成立してしまいます。
つまり、この問題の本質は価格そのものが改ざんされたわけではなく、価格計算の仕組みが壊れてしまったことにあります。
このように、ECサイトの価格計算で整数オーバーフローが発生すると、商品価格がマイナスになるなどの重大な問題につながることがあります。
「Low-level logic flaw」とは何か|ラボ名の意味をわかりやすく解説
ラボ名の「Low-level logic flaw」は次の意味です。
- Low-level:低レベル(プログラムの処理レベル)
- logic flaw:ロジックの欠陥
つまりこのラボは、プログラムの計算処理にあるロジックミスを表しています。
ビジネスの設計ミスというより、計算処理の細かいロジックの問題が原因になっています。
なぜこれはビジネスロジック脆弱性なのか
この問題は、SQLインジェクションやXSSのようなコードのバグではありません。
問題なのは、大量注文という想定外の使い方です。
サイト側は、「こんな数量を注文するユーザーはいないだろう」という前提で設計されています。
しかし攻撃者は、その前提を利用して計算処理を壊すことができます。
つまりこの脆弱性は、アプリケーションの処理ルールの隙を突いた攻撃になります。
これがビジネスロジック脆弱性です。
WordPress(WooCommerce)で起きるとどうなるか|ECサイトの具体例
ここで、WordPressサイトに置き換えて考えてみましょう。
例えば、WooCommerceで作られたECサイトです。
もし、次のような設計になっていたとします。
- 商品数量の上限が設定されていない
- カートの価格計算が単純な整数計算
- 異常な数量チェックがない
この場合、攻撃者は商品を何万個もカートに追加することができます。
【WordPressで起きる攻撃フロー】
商品ページ
↓
数量を大量に追加
↓
カートの合計価格が異常な値になる
↓
価格計算が壊れる
↓
合計金額がマイナスになる
↓
注文が通る
実際のWooCommerceでは多くの対策が入っていますが、自作ECサイトやカスタムプラグインでは起きる可能性があります。
WordPress ECサイトでの対策ポイント|価格計算ロジックを守る方法
この問題を防ぐには、次のような対策が重要です。
- 商品の最大数量を設定する
- カートの合計金額の範囲をチェックする
- 異常な価格計算が発生した場合は注文を拒否する
特に重要なのは、想定外の数量を必ずチェックすることです。
設計視点で見る ECサイトの価格計算ロジックの問題
このラボの本質は、次の設計ミスです。
数量が増え続けることを想定していない
ECサイトでは、数量が増えるほど価格が大きくなります。
しかし、このラボでは数値の上限を超える可能性が考慮されていませんでした。
結果として、
価格
↓
計算オーバーフロー
↓
マイナス価格
という異常状態が発生しています。
ECサイト設計で確認すべき5つのチェックポイント
ECサイト設計では、次のポイントを確認すると安全です。
- 商品数量の最大値は設定されているか
- カートの合計金額に上限チェックはあるか
- 異常な価格(マイナス値)が発生しないか
- 想定外の大量リクエストに耐えられるか
- サーバー側で必ず再計算しているか
ECサイト診断で確認するべきロジック脆弱性ポイント
ECサイトを診断する場合、次のポイントを確認します。
- 商品数量に制限があるか
- 価格計算がサーバー側で検証されているか
- 異常な価格が注文に反映されないか
特に、数量パラメータはビジネスロジック脆弱性の原因になりやすい部分です。
まとめ
「Low-level logic flaw」のラボでは、商品の数量を大量に追加することで価格計算が壊れ、商品を不正な価格で購入できる問題を解説しました。
この脆弱性のポイントは次です。
- 大量注文で価格計算が壊れる
- 整数オーバーフローが発生する
- 合計金額がマイナスになる
このような問題は、コードのバグではなく設計時の想定ミスから生まれます。
ECサイトでは、「普通のユーザーはこんな操作をしない」という前提を置かず、想定外の入力でも安全に動く設計が重要です。
