アプリケーションのDoS攻撃について
DoS(Denial of Service)攻撃とは、特定のWebアプリケーションやサーバーに過剰な負荷をかけ、正当なユーザーがサービスを利用できなくする攻撃です。DoS攻撃は、一つの攻撃者が単一のサーバーを標的に行う場合もあれば、DDoS(Distributed Denial of Service)攻撃のように複数の攻撃者や感染したコンピュータ群(ボットネット)を利用して大規模に行われる場合もあります。DoS攻撃は、システムリソースを枯渇させる、アプリケーションの脆弱性を悪用するなど、さまざまな手法で実行されます。
脆弱なコード例:リソース消費攻撃
<?php
// 大量のデータを返すエンドポイント
if ($_GET['type'] === 'large_data') {
$data = str_repeat('A', 10000000); // 10MBのデータを生成
echo $data;
}
?>
攻撃手法:
攻撃者がこのエンドポイントに大量のリクエストを送信することで、サーバーのメモリや帯域を使い果たし、サービスをダウンさせることができます。
while true; do curl http://example.com/large_data; done
脆弱なコード例:無限ループによるDoS攻撃
from flask import Flask, request
app = Flask(__name__)
@app.route('/loop')
def loop():
n = int(request.args.get('n', '1000000'))
for i in range(n):
pass
return "Done"
if __name__ == '__main__':
app.run()
攻撃手法:
攻撃者が非常に大きなn
の値を指定することで、サーバーが長時間にわたって処理を行い、他のリクエストに応答できなくなります。
curl "http://localhost:5000/loop?n=1000000000"
脆弱なコード例:JSONパースによるDoS攻撃
const express = require('express');
const app = express();
app.use(express.json());
app.post('/data', (req, res) => {
res.send('Data received');
});
app.listen(3000);
攻撃手法:
攻撃者が非常に大きなJSONデータを送信することで、サーバーのメモリを大量に消費させ、サーバーのパフォーマンスを低下させます。
curl -X POST http://localhost:3000/data -d '{"data": "'$(python -c 'print("A" * 10000000)')'"}'
脆弱なコード例:無限リダイレクトによるDoS攻撃
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedirectController {
@GetMapping("/redirect")
public String redirect() {
return "redirect:/redirect"; // 自分自身にリダイレクト
}
}
攻撃手法:
このエンドポイントにアクセスすると無限リダイレクトが発生し、サーバーが過剰にリソースを消費し、他のリクエストに応答できなくなります。
curl -v http://localhost:8080/redirect
PHPの例:
$ip = $_SERVER['REMOTE_ADDR'];
if (rate_limit_exceeded($ip)) {
http_response_code(429);
exit('Too Many Requests');
}
Node.jsの例(Express):
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分
max: 100 // 最大100リクエスト
});
app.use(limiter);
Python(Flask)の例:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 最大16MB
Node.jsの例:
app.use(express.json({ limit: '1mb' }));
Java(Spring Boot)の例:
@GetMapping("/loop")
public String loop(@RequestParam int n) {
if (n > 10000) {
return "Value too large";
}
// ループ処理
}
まとめ: アプリケーションに対するDoS攻撃は、サーバーのリソースを過剰に消費させることで、サービスを停止させる危険な攻撃です。レートリミットの導入、リクエストサイズの制限、リクエストのバリデーション、WAFの導入などの防止策を講じることで、このような攻撃に対する耐性を強化し、アプリケーションの可用性を維持することが重要です。