Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
699a0b6
fix: update entrypoint collector and enhance FastAPI route detection …
Ris-1kd Nov 26, 2025
86f3473
fix: update fastapi entrypoint
Ris-1kd Nov 26, 2025
812b3a0
fix: update fastapi
Ris-1kd Nov 26, 2025
9d11215
fix: resolve FastAPI route parsing issues
Ris-1kd Nov 27, 2025
30fdbdc
fix:FastAPI entrypoint
Ris-1kd Nov 27, 2025
d46215b
Merge branch 'antgroup:main' into main
Ris-1kd Dec 3, 2025
e61be5f
feat: add Tornado checker
Ris-1kd Dec 8, 2025
f32f9fb
feat: Tornado checker
Ris-1kd Dec 8, 2025
2067880
Fix: update Python analyzer and Tornado taint checker rules
Ris-1kd Dec 20, 2025
b08bead
Fix: update tornado framework
Ris-1kd Dec 22, 2025
d23f87b
Fix: update tornado framework
Ris-1kd Dec 22, 2025
9f58641
Fix: update tornado
Ris-1kd Dec 22, 2025
fbd5978
Fix: update tornado
Ris-1kd Dec 22, 2025
6c0fcd4
update tornado
Ris-1kd Dec 27, 2025
4aad909
Fix: update tornado
Ris-1kd Dec 28, 2025
92b1953
Fix: update tornado checker
Ris-1kd Jan 5, 2026
dc7583b
Fix: update tornado-framework
Ris-1kd Jan 9, 2026
b96962a
Fix: update tornado-framework
Ris-1kd Jan 9, 2026
3cceb62
Fix: update-tornado
Ris-1kd Jan 12, 2026
c8ff9dc
Fix:update-tornado
Ris-1kd Jan 12, 2026
39669e6
Fix: update-tornado-framework
Ris-1kd Jan 13, 2026
8d19c17
Fix: update tornado
Ris-1kd Jan 13, 2026
61c8b5f
Fix: update tornado-framework
Ris-1kd Jan 13, 2026
f84b50f
Fix:update tornado
Ris-1kd Jan 13, 2026
15da4c1
Fix: update tornado framework
Ris-1kd Jan 19, 2026
2682e6a
Fix: update tornado-framework
Ris-1kd Jan 19, 2026
fee55b1
Fix: update tornado framework
Ris-1kd Jan 20, 2026
a1721c2
Fix: update tornado framework
Ris-1kd Jan 22, 2026
f4428da
Fix: update tornado framework
Ris-1kd Jan 22, 2026
0d63baf
Fix: update tornado
Ris-1kd Jan 22, 2026
e20920a
Fix: update tornado-framework
Ris-1kd Jan 28, 2026
8244780
Fix: update tornado-framework
Ris-1kd Jan 28, 2026
73ae7ef
Fix: update tornado framework
Ris-1kd Jan 28, 2026
6f50c2a
Fix: update tornado framework
Ris-1kd Feb 3, 2026
d3ac17a
Fix: update tornado framework
Ris-1kd Feb 3, 2026
3ec065b
Fix: update tornado-framework
Ris-1kd Feb 4, 2026
e94be76
Fix: CVE-2024-11041
Ris-1kd Feb 11, 2026
a8d9c60
Fix: CVE
Ris-1kd Feb 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion resource/checker/checker-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,16 @@
"checkerPath": "checker/taint/python/django-taint-checker.ts",
"description": "python Django框架 entrypoint采集以及框架source添加"
},
{
"checkerId": "taint_flow_python_tornado_input",
"checkerPath": "checker/taint/python/tornado-taint-checker.ts",
"description": "python Tornado框架 entrypoint采集以及框架source添加"
},
{
"checkerId": "pickle_deserialization_checker",
"checkerPath": "checker/taint/python/pickle-deserialization-checker.ts",
"description": "Python Pickle反序列化漏洞检测器 (CVE-2024-11041)"
},
{
"checkerId": "taint_flow_test",
"checkerPath": "checker/taint/test-taint-checker.ts",
Expand All @@ -161,4 +171,4 @@
"checkerPath": "checker/sdk/get-ast-source-code-checker.ts",
"description": "获取AST对应的源码"
}
]
]
2 changes: 2 additions & 0 deletions resource/checker/checker-pack-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
"checkerIds": [
"taint_flow_python_input",
"taint_flow_python_django_input",
"taint_flow_python_tornado_input",
"callgraph",
"sanitizer"
],
Expand All @@ -96,6 +97,7 @@
"checkerIds": [
"taint_flow_python_input_inner",
"taint_flow_python_django_input",
"taint_flow_python_tornado_input",
"callgraph",
"sanitizer"
],
Expand Down
7 changes: 6 additions & 1 deletion resource/example-rule-config/rule_config_python.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
[
{
"checkerIds": ["taint_flow_python_input", "taint_flow_python_input_inner", "taint_flow_python_django_input"],
"checkerIds": [
"taint_flow_python_input",
"taint_flow_python_input_inner",
"taint_flow_python_django_input",
"taint_flow_python_tornado_input"
],
"sources": {
"FuncCallReturnValueTaintSource": [
{
Expand Down
129 changes: 129 additions & 0 deletions src/checker/taint/python/pickle-deserialization-checker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
const IntroduceTaint = require('../common-kit/source-util')
const TaintChecker = require('../taint-checker')
const TaintOutputStrategy = require('../../common/output/taint-output-strategy')
const CommonUtil = require('../../../util/common-util')

const TAINT_TAG = 'CROSS_BOUNDARY_DATA'
const CHECKER_ID = 'pickle_deserialization_checker'

/**
*
*/
class PickleDeserializationChecker extends TaintChecker {
entryPoints: any[]

/**
*
* @param resultManager
*/
constructor(resultManager: any) {
super(resultManager, CHECKER_ID)
this.entryPoints = []
this.initRules()
}

/**
*
*/
initRules(): void {
this.checkerRuleConfigContent.sources = {}
this.checkerRuleConfigContent.sinks = {}
}

/**
*
* @param analyzer
*/
triggerAtStartOfAnalyze(analyzer: any): void {
this.prepareEntryPoints(analyzer)
analyzer.entryPoints.push(...this.entryPoints)
}

/**
*
* @param analyzer
*/
prepareEntryPoints(analyzer: any): void {
const epHelper = require('../../common/full-callgraph-file-entrypoint')
epHelper.makeFullCallGraph(analyzer)
this.entryPoints.push(...epHelper.getAllEntryPointsUsingCallGraph(analyzer.ainfo?.callgraph))
this.entryPoints.push(...epHelper.getAllFileEntryPointsUsingFileManager(analyzer.fileManager))

CommonUtil.initSourceScopeByTaintSourceWithLoc(this.sourceScope, this.checkerRuleConfigContent.sources?.TaintSource)
}

/**
*
* @param analyzer
* @param scope
* @param node
* @param state
* @param info
*/
triggerAtFunctionCallBefore(analyzer: any, scope: any, node: any, state: any, info: any): void {
const { fclos, argvalues } = info
if (this.isSink(node)) {
const arg0 = argvalues?.[0]
if (arg0?._tags?.has(TAINT_TAG)) {
const finding = this.buildTaintFinding(
CHECKER_ID,
this.desc,
node,
arg0,
fclos,
TAINT_TAG,
'pickle.loads\nSINK Attribute: UnsafeDeserialization',
[],
undefined
)
if (TaintOutputStrategy.isNewFinding(this.resultManager, finding)) {
this.resultManager.newFinding(finding, TaintOutputStrategy.outputStrategyId)
}
}
}
}

/**
*
* @param analyzer
* @param scope
* @param node
* @param state
* @param info
*/
triggerAtFunctionCallAfter(analyzer: any, scope: any, node: any, state: any, info: any): void {
const { fclos, ret } = info

if (this.isSource(node) && ret) {
IntroduceTaint.setTaint(ret, [TAINT_TAG])
ret.trace = ret.trace || []
ret.trace.push({ node, type: 'SOURCE' })
}
if (fclos?.object?._tags?.has(TAINT_TAG) && ret) {
IntroduceTaint.setTaint(ret, [TAINT_TAG])
if (fclos.object.trace && !ret.trace) {
ret.trace = fclos.object.trace
}
}
}

/**
*
* @param node
*/
isSource(node: any): boolean {
const callee = node?.callee
return callee?.type === 'MemberAccess' && callee?.property?.name === 'socket'
}

/**
*
* @param node
*/
isSink(node: any): boolean {
const callee = node?.callee
return callee?.type === 'MemberAccess' && callee?.object?.name === 'pickle' && callee?.property?.name === 'loads'
}
}

module.exports = PickleDeserializationChecker
Loading