Spring data JPA Checkmarx 漏洞-@Query 注解的资源访问授权不当

Posted

技术标签:

【中文标题】Spring data JPA Checkmarx 漏洞-@Query 注解的资源访问授权不当【英文标题】:Spring data JPA Checkmarx vulnerability- Improper Resource Access Authorization for @Query annotation 【发布时间】:2020-01-09 11:59:35 【问题描述】:

我们目前正在开发具有使用 Spring 数据 JPA 实现的持久层的 Web 应用程序,它对我们来说工作得非常好,但是在使用 checkmarx 扫描我们的代码时它抱怨 “不正确的资源访问授权” 错误对于下面代码 sn-p 中的所有输入参数。不确定如何解决它。根据我的理解,我们尝试了以下方法,但这也无济于事

使用@valid@Pattern的白名单输入参数 注释

使用spring security的@Secured("ROLE_TEST")注解的安全方法。

@Repository
public interface EmployeeAddressRepository extends JpaRepository<EmployeeAddress, Integer> 

  @Query("select empAdd from EmployeeAddress empAdd where empAdd.Employee.employeeId=?1 and (endDate) ORDER BY empAdd.lastUpdateTimeStamp DESC")
  List<EmployeeAddress> findEmployeeAddressByEmployeeId(String employeeId, LocalDate date) throws PersistenceException;

期待这里的任何指针朝着正确的方向前进

【问题讨论】:

您是否正在验证 REST 接口上的输入? 是的,我正在这样做,我也提到过 - 使用有效和模式注释将输入参数列入白名单 【参考方案1】:

在其他答案之一的 cmets 中,有人提供了答案。本质上,Checkmarx 无法确定您是否正在检查用户/服务是否有权执行此命令。

一个安全的实现应该是这样的:

if(userCanPerformAction(employeeId))
   repository.findEmployeeAddressByEmployeeId(employeeId, date)

在调用存储库之前知道您的代码是否确实执行了所需的检查是不够聪明的。因此,您需要做的是在执行 findEmployeeAddressByEmployeeId 之前验证您是否进行了正确的验证检查。如果您是,那么您将按照您的组织流程将某些内容标记为误报。

【讨论】:

【参考方案2】:

也许 Checkmarx 不支持序数参数表示法,尝试像这样重写查询:

@Query("select empAdd from EmployeeAddress empAdd where empAdd.Employee.employeeId= :empId and (endDate) ORDER BY empAdd.lastUpdateTimeStamp DESC", employeeIdParameter)

其中employeeIdParameter 是输入参数。

希望这会有所帮助, 阿米特

【讨论】:

我需要查看攻击向量以了解更多信息。如果您愿意,我们可以举行一次简短的 Webex 会议,我可以尝试为您提供帮助。你可以在这里给我写信:amit.finegold@gmail.com 然后我们会在这里发布决议供大家查看。 感谢您提供帮助。我已通过电子邮件分享了所需的信息。 我也面临同样的问题。你们有解决办法吗? @Amit Finegold 你能分享你的意见吗

以上是关于Spring data JPA Checkmarx 漏洞-@Query 注解的资源访问授权不当的主要内容,如果未能解决你的问题,请参考以下文章

Checkmarx 反射型 XSS

集成Spring Data JPA

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

spring data jpa怎么和solr整合

spring data jpa问题