alipay / alipay/ant-application-security-testing-benchmark

4 个 case 的 evaluation item 标注指向了隔壁目录的评价项,在部分文件系统下会导致打分工具 NPE

Đang mở
#162 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
495
Fork
62
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

# 4 个 case 的 evaluation item 标注指向了隔壁目录的评价项,在部分文件系统下会导致打分工具 NPE

## 问题

以下 4 个 case 文件里标注的 `evaluation item`,与「列出该 case 的 config.json」所声明的 `evaluation_item` 不一致:

| case 文件 | 所在目录 | 文件内标注的 evaluation item | 该目录 config.json 的 evaluation_item |
|---|---|---|---|
| `asynchronous_promisify_001_T.js` | `sast-js/case/completeness/single_app_tracing/asynchronous_tracing/delayed_execution_async/` | `完整度->单应用跟踪完整度->并发、多线程、异步->同步原语` | `...->延迟执行异步` |
| `asynchronous_promisify_002_F.js` | 同上 | 同上 | 同上 |
| `Private_Variable_001_T.java` | `sast-java/src/main/java/com/sast/astbenchmark/case_language_maturity/completeness/single_app_tracing/variable_scope/private_variable/` | `完整度->单应用跟踪完整度->变量作用域->静态变量` | `...->private变量` |
| `Private_Variable_002_F.java` | 同上 | 同上 | 同上 |

这 4 个 case 的 `bind_url` 和所在目录都指向 `delayed_execution_async` / `private_variable`,只有 `evaluation item` 一行写成了隔壁评价项,看起来是复制模板时漏改。

对 `sast-js` / `sast-go` / `sast-java` / `sast-python2` / `sast-python3` 全量比对过(config.json 引用的 case 共 2837 个),不一致的只有上面这 4 个。

## 影响一:打分工具在部分文件系统上直接崩溃

`BenchmarkScore.readExpectedResultsNew()` 用 `Files.find(...)` 遍历 config.json,而 `levelMap` / `composeMap` 是**静态**字段、跨 config.json 累加。每读一个 config.json,都会拿它去遍历该语言的全部 case,命中 `composeMap` 但没进 `levelMap` 的就抛 NPE(`BenchmarkScore.java:1352` 附近):

```
java.lang.NullPointerException: Please check asynchronous_promisify_002_F.js is the relevant configuration correct?
bind_url: /completeness/single_app_tracing/asynchronous_tracing/delayed_execution_async/asynchronous_promisify_002_F
evaluation_item: 完整度->单应用跟踪完整度->并发、多线程、异步->同步原语
at com.alipay.xast.score.BenchmarkScore.processJsonFile(BenchmarkScore.java:1355)
at com.alipay.xast.score.BenchmarkScore.lambda$readExpectedResultsNew$13(BenchmarkScore.java:1170)
```

于是崩不崩完全取决于 `Files.find` 的返回顺序:

- 先读到 `delayed_execution_async/config.json` → 文件名已进 `levelMap` → 正常
- 先读到 `promise_callback_await/config.json`(它声明了「同步原语」)→ NPE,整个打分中断

同一份代码、同一份数据,在 macOS(APFS) 上通过,在 Linux 容器(overlayfs) 里必崩:

```
macOS: delayed_execution_async/config.json 先被处理 → 通过
容器 overlayfs: promise_callback_await/config.json 先被处理 → NPE
```

`sast-java` 是同样的情况(`Private_Variable_002_F.java`)。也就是说,在 Docker 里跑 `create-scorecard` 时,`sast-js` 和 `sast-java` 这两个靶场目前无法出报告。

## 影响二:即使不崩,这 4 个 case 的归属也是错的

在 macOS 上能正常出报告,但生成的 xlsx 里:

```
文件名: asynchronous_promisify_001_T.js
评价项: 完整度->单应用跟踪完整度->并发、多线程、异步->同步原语
评价项达成条件: async_await_001_T.js && !async_await_002_F.js, asynchronous_promise_001_T.js && ...
```

「评价项达成条件」取的是「同步原语」那组的 compose 表达式,**其中并不包含这个 case 自己**。这 4 个用例被挂到了与自身无关的评价项下面。

## 建议

1. 把这 4 个文件的 `evaluation item` 改成与所在目录 / config.json 一致(`延迟执行异步`、`private变量`);如果设计意图确实是归到「同步原语」/「静态变量」,那就应该调整 config.json 的分组,把这些 case 移进对应的 scene_list。
2. 另外建议在 `BenchmarkScore.readExpectedResultsNew()` 的两处 `Files.find(...)` 后加 `.sorted()`。静态累加的 `levelMap`/`composeMap` 叠加文件系统相关的遍历顺序,会让同样的数据在不同平台给出不同结果(要么崩、要么静默通过),排序后至少能保证行为与平台无关、问题可复现。

## 复现环境

- macOS 15 (APFS) + JDK 11:通过
- `maven:3.9.6-eclipse-temurin-11` 容器 (overlayfs) + 同一份仓库:`sast-js` / `sast-java` 均 NPE
- 命令:`mvn com.alipay.xast:xastutils-maven-plugin:create-scorecard -Dlang=js -DdirectoryPath=<靶场> -DresultFile=<任意可被 Reader 解析的结果文件>`

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.