【问题标题】:Integer overflow attack mitigation in Spring Rest APISpring Rest API 中的整数溢出攻击缓解
【发布时间】:2022-01-11 19:57:37
【问题描述】:

我们目前正在对我们的网络应用进行安全漏洞评估。为此,我们一直在使用 OWASP 的 ZAP 工具进行自动化渗透测试。我们从 ZAP 收到的警报之一是整数溢出错误,描述如下:An integer overflow condition exists when an integer, which has not been properly checked from the input stream is used within a compiled program.

实际报告如下:

上面列出的API的方法签名如下:

    @GetMapping(value = "/list")
    public ResponseEntity<PaginatedResponse> getUserList(
            @RequestParam(name = "searchQuery", defaultValue = "") String searchString,
            @RequestParam(defaultValue = "1") int pageNumber, 
            @RequestParam(defaultValue = "100") int pageSize,
            @RequestParam(name = "sort_by",required = false) String sortBy,
            @RequestParam(name = "descending",defaultValue = "false") boolean isDescending)

我们将 Spring Boot 用于我们的 REST API,pageSize 和 pageNumber 参数是传递给 PageRequest 用于分页目的的值。

我已尝试添加检查以查看输入值是否介于 Integer.MIN_VALUE 和 Integer.MAX_VALUE 之间,但由于转换值的环绕行为,结果值仍有可能是有效整数大于 Java 中整数变量的整数限制。

另外需要注意的是,该工具还将一个整数值传递给一个期望为布尔值的变量(上面屏幕截图中的descending),我认为这也必须以某种方式解决。

也许有一些方法可以在绑定发生之前发现这样的问题?

【问题讨论】:

    标签: java spring-boot integer-overflow zap spring-mvc-test


    【解决方案1】:

    这与将字符串转换为有效整数无关。 Spring 已经解决了这个问题。

    OWASP ZAP page 中描述了实际问题。一个非常大的页码在添加后可能会溢出为负数,从而导致您的应用程序中可能出现意外行为。例如,考虑

    https:/...?pageNumber=2147483646&pageSize=100
    

    pageNumber 是一个完全有效的 int,其值为 Integer.MAX_VALUE - 1。但是,如果您的应用程序随后将pageSize 添加到其中,它将溢出。您可以通过验证 pageNumberpageSize 在合理值范围内来缓解,例如pageNumber 介于 1 和 1000000 之间,pageSize 介于 1 和 10000 之间。

    【讨论】:

    • 在对此进行了更多测试后,我发现 Spring 抛出了 MethodArgumentTypeMismatchException。异常消息是:Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "75200819393726134959398316129505110502500992"。所以我猜不需要检查传入值的限制,因为如果该值与绑定变量的数据类型不匹配,Spring 无论如何都会抛出这个异常。我已更新 ControllerAdvice 以处理此异常并返回 400 响应。
    【解决方案2】:

    一个简单且性能有点低效的解决方案是将您的所有参数接收为String,并通过适当的验证进行自己的解析。

    【讨论】:

    • 似乎这就是 Spring 所做的(参考我对另一个答案的评论)。所以,我想我们不需要自己处理。
    猜你喜欢
    • 2011-11-12
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多