Sonar 和 findsecbugs 使用 Spring 表达式时潜在的代码注入

Sonar and findsecbugs Potential code injection when using Spring Expression

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

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

当 运行 Sonar 工具与 Findsecbugs 一起时,我们被告知代码中存在漏洞,错误为“This use of org/springframework/expression/ExpressionParser.parseExpression(Ljava/lang/String;)Lorg/springframework/expression/Expression; 可能易受代码注入攻击(Spring 表达式)”。违规行是下面的第 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 的误报吗?除了使用 <@SuppressFBWarnings(value = {"SPEL_INJECTION"}, justification = "false positive")> 注释之外,还有什么方法可以防止出现 Sonar & Findsecbugs 错误?

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

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


旁注: 我认为该工具将注释视为始终安全是合理的。 I created a ticket 达到这个效果。