Sonar 和 findsecbugs 使用 Spring Expression 时的潜在代码注入

Posted

技术标签:

【中文标题】Sonar 和 findsecbugs 使用 Spring Expression 时的潜在代码注入【英文标题】:Sonar and findsecbugs Potential code injection when using Spring Expression 【发布时间】:2021-05-09 12:35:17 【问题描述】:

我们有一个 spring-boot (2.4.2) 应用程序和一个 Aspect 类,它执行一些处理“Around”方法,这些方法使用我们定义的自定义注释进行注释,并使用 SpEL 处理。

SpEL 表达式由我们定义为注释中的字段。

在运行 Sonar 工具和 Findsecbugs 时,我们被告知代码中存在漏洞,并出现错误“This use of org/springframework/expression/ExpressionParser.parseExpression(Ljava/lang/String;)Lorg /springframework/expression/Expression; 可能容易受到代码注入 (Spring Expression)" 的影响。违规行是下面的第 4 行:

1. private final ExpressionParser elParser = new SpelExpressionParser();
...
2. @Around(value = "@annotation(myCustomAnnotation)")
3. public Object aroundAdviceHandler(ProceedingJoinPoint joinPoint, MyCustomAnnotation myCustomAnnotation) throws Throwable 
  ...
  4. **Expression expression = elParser.parseExpression(myCustomAnnotation.entityId());**

使用此方面的注释代码如下所示:

@Transactional
@MyCustomAnnotation(entityId = "[0].id") // some other methods my have here only "[0]" or "[0].otherId"
public Long save(JustADto dto) 

最后,自定义注解如下所示:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) public
@interface MyCustomAnnotation 
    String entityId() default "";

这段代码似乎没有任何漏洞,因为spring表达式的输入是我们提供的。这是 Findsecbugs 的误报吗?除了使用 注释之外,还有什么方法可以防止出现 Sonar & Findsecbugs 错误?

【问题讨论】:

【参考方案1】:

MyCustomAnnotation.entityId() 返回的值是在您的代码中硬编码的表达式。因此,我认为来源是安全的

您可以信任编写代码的开发人员。您不能信任远程用户。 这里的值只由开发者控制。


旁注:我认为该工具认为注释始终安全是合理的。 I created a ticket 大意。

【讨论】:

以上是关于Sonar 和 findsecbugs 使用 Spring Expression 时的潜在代码注入的主要内容,如果未能解决你的问题,请参考以下文章

findsecbugs 报告导入库代码段漏洞的原因

使用Jenkins Sonar插件构建成功后,Sonar没有显示代码覆盖率

sonar-scanner的执行流程和对ClassLoader,动态代理的使用

mac 下sonarqube和sonar scanner的配置和使用

使用OCLint和Sonar对iOS代码分析和质量管理

Gradle + Sonar 主机 URL 和基本身份验证