API4:2023 - Unrestricted Resource Consumption چیست
مهاجم به واسطه این آسیب پذیری می تواند به سبب عدم محدودیت در درخواست دسترسی به منابع امکان اختلال در وضیعت سرویس دهی API و همچنین منجرب به خطاهای عدم منابع کافی برای پردازش گردد.
مثال:
درخواست POST برای ارسال پیامک به شماره موبایل مشخص:
POST /api/sms/send Body: { "phone_number": "1234567890", "message": "Hello, this is a test message." }
کد آسیب پذیر(NET.):
[ApiController] [Route("api/resource")] public class ResourceController : ControllerBase { private readonly ResourceService _resourceService; public ResourceController(ResourceService resourceService) { _resourceService = resourceService; } [HttpPost] public IActionResult ProcessResource(ResourceRequest request) { // Process the resource request string result = _resourceService.Process(request); // Return the result return Ok(result); } // Other methods... }
پیشگیری (NET.):
[ApiController] [Route("api/resource")] public class ResourceController : ControllerBase { private readonly ResourceService _resourceService; public ResourceController(ResourceService resourceService) { _resourceService = resourceService; } [HttpPost] public IActionResult ProcessResource(ResourceRequest request) { // Validate the resource request if (!IsValidRequest(request)) { return BadRequest(); } // Process the resource request with resource consumption limits bool success = _resourceService.ProcessWithLimits(request); // Check if the resource consumption was successful if (!success) { return StatusCode((int)HttpStatusCode.TooManyRequests); } // Return the result return Ok("Resource processed successfully"); } private bool IsValidRequest(ResourceRequest request) { // Implement your validation logic here // Check if the request is valid // Return true if valid, false otherwise } // Other methods... }
کد آسیب پذیر (جاوا):
@RestController @RequestMapping("/api") public class ResourceController { private final ResourceService resourceService; public ResourceController(ResourceService resourceService) { this.resourceService = resourceService; } @PostMapping("/resource") public ResponseEntity<String> processResource(@RequestBody ResourceRequest request) { // Process the resource request String result = resourceService.process(request); // Return the result return ResponseEntity.ok(result); } // Other methods... } پیشگیری (جاوا): @RestController @RequestMapping("/api") public class ResourceController { private final ResourceService resourceService; public ResourceController(ResourceService resourceService) { this.resourceService = resourceService; } @PostMapping("/resource") public ResponseEntity<String> processResource(@RequestBody ResourceRequest request) { // Validate the resource request if (!isValidRequest(request)) { return ResponseEntity.badRequest().build(); } // Process the resource request with resource consumption limits boolean success = resourceService.processWithLimits(request); // Check if the resource consumption was successful if (!success) { return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).build(); } // Return the result return ResponseEntity.ok("Resource processed successfully"); } private boolean isValidRequest(ResourceRequest request) { // Implement your validation logic here // Check if the request is valid // Return true if valid, false otherwise } // Other methods... }
پیشنهادات کلی جلوگیری:
محدودیت منابع مصرفی هر درخواست API، مانند محدودیت پهنای باند، تعداد درخواستها در یک بازه زمانی معین و حداکثر تعداد پیامکها یا تماسهای تلفنی.
بررسی و اعتبارسنجی درخواستهای API بر اساس سقف مجاز برای مصرف منابع و اعمال محدودیتهای لازم.
استفاده از مکانیزمهای محدودیت ترافیک و کنترل پهنای باند مانند محدودیتهای پیشرفته شبکه (Advanced Network Limiting)، به منظور کنترل منابع مصرفی توسط هر کاربر یا سرویس.
نظارت و ثبت لاگهای مصرف منابع برای تشخیص الگوهای مشکوک و اقدام به اعتبارسنجی دقیقتر در صورت لزوم.
اجرای آزمونهای تحمل بار (Load Testing) و ارزیابی عملکرد منابع سیستم به منظور تشخیص و پیشگیری از مشکلات مصرف منابع نامناسب.