cognium-dev 3.133.0 → 3.135.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +357 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -22613,6 +22613,9 @@ class LanguageSourcesPass {
|
|
|
22613
22613
|
for (const finding of findGoPluginOpenCodeInjectionFindings(code, graph.ir.meta.file)) {
|
|
22614
22614
|
ctx.addFinding(finding);
|
|
22615
22615
|
}
|
|
22616
|
+
for (const finding of findGoMongoNosqlInjectionFindings(code, graph.ir.meta.file)) {
|
|
22617
|
+
ctx.addFinding(finding);
|
|
22618
|
+
}
|
|
22616
22619
|
}
|
|
22617
22620
|
if (language === "python") {
|
|
22618
22621
|
additionalSanitizers.push(...findPythonNetlocAllowlistGuardSanitizers(code));
|
|
@@ -22637,6 +22640,9 @@ class LanguageSourcesPass {
|
|
|
22637
22640
|
for (const finding of findPythonInteractiveInterpreterCodeInjectionFindings(code, graph.ir.meta.file)) {
|
|
22638
22641
|
ctx.addFinding(finding);
|
|
22639
22642
|
}
|
|
22643
|
+
for (const finding of findPythonMongoengineWhereNosqlInjectionFindings(code, graph.ir.meta.file)) {
|
|
22644
|
+
ctx.addFinding(finding);
|
|
22645
|
+
}
|
|
22640
22646
|
}
|
|
22641
22647
|
if (language === "rust") {
|
|
22642
22648
|
additionalSanitizers.push(...findRustSetAllowlistGuardSanitizers(code));
|
|
@@ -22700,6 +22706,12 @@ class LanguageSourcesPass {
|
|
|
22700
22706
|
for (const finding of findJavaResponseWriterXssFindings(code, graph.ir.meta.file)) {
|
|
22701
22707
|
ctx.addFinding(finding);
|
|
22702
22708
|
}
|
|
22709
|
+
for (const finding of findJavaMongoNosqlInjectionFindings(code, graph.ir.meta.file)) {
|
|
22710
|
+
ctx.addFinding(finding);
|
|
22711
|
+
}
|
|
22712
|
+
for (const finding of findJavaUrlOpenStreamSsrfFindings(code, graph.ir.meta.file)) {
|
|
22713
|
+
ctx.addFinding(finding);
|
|
22714
|
+
}
|
|
22703
22715
|
}
|
|
22704
22716
|
if (language === "python" || language === "javascript" || language === "typescript" || language === "go") {
|
|
22705
22717
|
const exfilFindings = findExternalSecretExfiltrationFindings(code, graph.ir.meta.file, language);
|
|
@@ -26680,6 +26692,350 @@ function findRustEvalCrateCodeInjectionFindings(code, file) {
|
|
|
26680
26692
|
}
|
|
26681
26693
|
return findings;
|
|
26682
26694
|
}
|
|
26695
|
+
function findGoMongoNosqlInjectionFindings(code, file) {
|
|
26696
|
+
const findings = [];
|
|
26697
|
+
if (typeof code !== "string" || code.length === 0)
|
|
26698
|
+
return findings;
|
|
26699
|
+
if (!/(\bbson\s*\.\s*[MDAE]\b|mongo-driver|\*\s*mongo\.Collection)/.test(code)) {
|
|
26700
|
+
return findings;
|
|
26701
|
+
}
|
|
26702
|
+
const lines = code.split(`
|
|
26703
|
+
`);
|
|
26704
|
+
const reqExtractRe = /\b\w+\s*\.\s*(?:FormValue|PostFormValue|URL\s*\.\s*Query\s*\(\s*\)\s*\.\s*Get|Header\s*\.\s*Get|Cookie)\s*\(/;
|
|
26705
|
+
const httpReqParamRe = /\*\s*http\.Request\b/;
|
|
26706
|
+
const opsAlt = "(?:FindOne|Find|InsertOne|InsertMany|UpdateOne|UpdateMany|DeleteOne|DeleteMany|FindOneAndUpdate|FindOneAndDelete|FindOneAndReplace|Aggregate)";
|
|
26707
|
+
const callHeadRe = new RegExp(`\\.\\s*(${opsAlt})\\s*\\(`);
|
|
26708
|
+
function extractBalanced(line, openIdx) {
|
|
26709
|
+
let depth = 0;
|
|
26710
|
+
for (let k = openIdx;k < line.length; k++) {
|
|
26711
|
+
const ch = line[k];
|
|
26712
|
+
if (ch === "(")
|
|
26713
|
+
depth++;
|
|
26714
|
+
else if (ch === ")") {
|
|
26715
|
+
depth--;
|
|
26716
|
+
if (depth === 0)
|
|
26717
|
+
return line.substring(openIdx + 1, k);
|
|
26718
|
+
}
|
|
26719
|
+
}
|
|
26720
|
+
return null;
|
|
26721
|
+
}
|
|
26722
|
+
const funcs = [];
|
|
26723
|
+
let cur = null;
|
|
26724
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26725
|
+
const t = lines[i2].trim();
|
|
26726
|
+
if (/^func\b/.test(t)) {
|
|
26727
|
+
if (cur) {
|
|
26728
|
+
cur.end = i2 - 1;
|
|
26729
|
+
funcs.push(cur);
|
|
26730
|
+
}
|
|
26731
|
+
cur = { start: i2, end: lines.length - 1 };
|
|
26732
|
+
}
|
|
26733
|
+
}
|
|
26734
|
+
if (cur)
|
|
26735
|
+
funcs.push(cur);
|
|
26736
|
+
for (const fn of funcs) {
|
|
26737
|
+
const header = lines[fn.start];
|
|
26738
|
+
if (!httpReqParamRe.test(header))
|
|
26739
|
+
continue;
|
|
26740
|
+
const taintedVars = new Set;
|
|
26741
|
+
for (let pass = 0;pass < 3; pass++) {
|
|
26742
|
+
const before = taintedVars.size;
|
|
26743
|
+
for (let i2 = fn.start;i2 <= fn.end; i2++) {
|
|
26744
|
+
const trimmed = lines[i2].trim();
|
|
26745
|
+
const assignMatch = trimmed.match(/^(\w+)\s*(?::=|=)\s*(.+?)(?:\s*\/\/.*)?$/);
|
|
26746
|
+
if (!assignMatch)
|
|
26747
|
+
continue;
|
|
26748
|
+
const lhs = assignMatch[1];
|
|
26749
|
+
const rhs = assignMatch[2];
|
|
26750
|
+
if (taintedVars.has(lhs))
|
|
26751
|
+
continue;
|
|
26752
|
+
if (reqExtractRe.test(rhs)) {
|
|
26753
|
+
taintedVars.add(lhs);
|
|
26754
|
+
continue;
|
|
26755
|
+
}
|
|
26756
|
+
for (const v of taintedVars) {
|
|
26757
|
+
if (new RegExp(`\\b${v}\\b`).test(rhs)) {
|
|
26758
|
+
taintedVars.add(lhs);
|
|
26759
|
+
break;
|
|
26760
|
+
}
|
|
26761
|
+
}
|
|
26762
|
+
}
|
|
26763
|
+
if (taintedVars.size === before)
|
|
26764
|
+
break;
|
|
26765
|
+
}
|
|
26766
|
+
if (taintedVars.size === 0)
|
|
26767
|
+
continue;
|
|
26768
|
+
for (let i2 = fn.start;i2 <= fn.end; i2++) {
|
|
26769
|
+
const line = lines[i2];
|
|
26770
|
+
const m = callHeadRe.exec(line);
|
|
26771
|
+
if (!m)
|
|
26772
|
+
continue;
|
|
26773
|
+
const op = m[1];
|
|
26774
|
+
const openIdx = m.index + m[0].length - 1;
|
|
26775
|
+
const args2 = extractBalanced(line, openIdx);
|
|
26776
|
+
if (args2 === null || args2.length === 0)
|
|
26777
|
+
continue;
|
|
26778
|
+
let tainted = reqExtractRe.test(args2);
|
|
26779
|
+
if (!tainted) {
|
|
26780
|
+
for (const v of taintedVars) {
|
|
26781
|
+
if (new RegExp(`\\b${v}\\b`).test(args2)) {
|
|
26782
|
+
tainted = true;
|
|
26783
|
+
break;
|
|
26784
|
+
}
|
|
26785
|
+
}
|
|
26786
|
+
}
|
|
26787
|
+
if (!tainted)
|
|
26788
|
+
continue;
|
|
26789
|
+
findings.push({
|
|
26790
|
+
id: `nosql_injection-${file}-${i2 + 1}-go-mongo-${op.toLowerCase()}`,
|
|
26791
|
+
pass: "language-sources",
|
|
26792
|
+
category: "security",
|
|
26793
|
+
rule_id: "nosql_injection",
|
|
26794
|
+
cwe: "CWE-943",
|
|
26795
|
+
severity: "critical",
|
|
26796
|
+
level: "error",
|
|
26797
|
+
message: `NoSQL injection: Go MongoDB driver \`${op}(...)\` called with a ` + "filter derived from *http.Request input. Untrusted values inside " + "a `bson.M` / `bson.D` filter can be operator objects (e.g. " + '`{"$ne": null}`) and bypass authentication/intent. Validate or ' + "coerce the value to a primitive before building the filter.",
|
|
26798
|
+
file,
|
|
26799
|
+
line: i2 + 1,
|
|
26800
|
+
snippet: line.trim()
|
|
26801
|
+
});
|
|
26802
|
+
}
|
|
26803
|
+
}
|
|
26804
|
+
return findings;
|
|
26805
|
+
}
|
|
26806
|
+
function findJavaMongoNosqlInjectionFindings(code, file) {
|
|
26807
|
+
const findings = [];
|
|
26808
|
+
if (typeof code !== "string" || code.length === 0)
|
|
26809
|
+
return findings;
|
|
26810
|
+
if (!/(MongoCollection\b|com\.mongodb\b|\bFilters\b|\bnew\s+Document\s*\()/.test(code)) {
|
|
26811
|
+
return findings;
|
|
26812
|
+
}
|
|
26813
|
+
const lines = code.split(`
|
|
26814
|
+
`);
|
|
26815
|
+
const reqExtractRe = /\b\w+\s*\.\s*(?:getParameter|getParameterValues|getHeader|getHeaders|getCookies|getReader|getQueryString|getRequestURI|getInputStream|getPart|getParts)\s*\(/;
|
|
26816
|
+
const opsAlt = "(?:find|findOne|findOneAndUpdate|findOneAndDelete|findOneAndReplace|insertOne|insertMany|updateOne|updateMany|deleteOne|deleteMany|replaceOne|aggregate|countDocuments|distinct)";
|
|
26817
|
+
const callRe = new RegExp(`\\.\\s*(${opsAlt})\\s*\\(([\\s\\S]*?)\\)`);
|
|
26818
|
+
const taintedVars = new Set;
|
|
26819
|
+
for (let pass = 0;pass < 3; pass++) {
|
|
26820
|
+
const before = taintedVars.size;
|
|
26821
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26822
|
+
const t = lines[i2].trim();
|
|
26823
|
+
const a = t.match(/^(?:final\s+)?(?:[\w<>?,\[\]]+\s+)?(\w+)\s*=\s*(.+?);?$/);
|
|
26824
|
+
if (!a)
|
|
26825
|
+
continue;
|
|
26826
|
+
const lhs = a[1];
|
|
26827
|
+
const rhs = a[2];
|
|
26828
|
+
if (taintedVars.has(lhs))
|
|
26829
|
+
continue;
|
|
26830
|
+
if (reqExtractRe.test(rhs)) {
|
|
26831
|
+
taintedVars.add(lhs);
|
|
26832
|
+
continue;
|
|
26833
|
+
}
|
|
26834
|
+
for (const v of taintedVars) {
|
|
26835
|
+
if (new RegExp(`\\b${v}\\b`).test(rhs)) {
|
|
26836
|
+
taintedVars.add(lhs);
|
|
26837
|
+
break;
|
|
26838
|
+
}
|
|
26839
|
+
}
|
|
26840
|
+
}
|
|
26841
|
+
if (taintedVars.size === before)
|
|
26842
|
+
break;
|
|
26843
|
+
}
|
|
26844
|
+
if (taintedVars.size === 0)
|
|
26845
|
+
return findings;
|
|
26846
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26847
|
+
const line = lines[i2];
|
|
26848
|
+
const m = line.match(callRe);
|
|
26849
|
+
if (!m)
|
|
26850
|
+
continue;
|
|
26851
|
+
const op = m[1];
|
|
26852
|
+
const args2 = m[2];
|
|
26853
|
+
if (args2.trim().length === 0)
|
|
26854
|
+
continue;
|
|
26855
|
+
let tainted = reqExtractRe.test(args2);
|
|
26856
|
+
if (!tainted) {
|
|
26857
|
+
for (const v of taintedVars) {
|
|
26858
|
+
if (new RegExp(`\\b${v}\\b`).test(args2)) {
|
|
26859
|
+
tainted = true;
|
|
26860
|
+
break;
|
|
26861
|
+
}
|
|
26862
|
+
}
|
|
26863
|
+
}
|
|
26864
|
+
if (!tainted)
|
|
26865
|
+
continue;
|
|
26866
|
+
findings.push({
|
|
26867
|
+
id: `nosql_injection-${file}-${i2 + 1}-java-mongo-${op.toLowerCase()}`,
|
|
26868
|
+
pass: "language-sources",
|
|
26869
|
+
category: "security",
|
|
26870
|
+
rule_id: "nosql_injection",
|
|
26871
|
+
cwe: "CWE-943",
|
|
26872
|
+
severity: "critical",
|
|
26873
|
+
level: "error",
|
|
26874
|
+
message: `NoSQL injection: Java Mongo driver \`${op}(...)\` called with a ` + "filter derived from servlet request input. Untrusted values can " + "reach BSON operator positions and bypass intent. Validate the " + "input type before constructing the filter (e.g. require String).",
|
|
26875
|
+
file,
|
|
26876
|
+
line: i2 + 1,
|
|
26877
|
+
snippet: line.trim()
|
|
26878
|
+
});
|
|
26879
|
+
}
|
|
26880
|
+
return findings;
|
|
26881
|
+
}
|
|
26882
|
+
function findPythonMongoengineWhereNosqlInjectionFindings(code, file) {
|
|
26883
|
+
const findings = [];
|
|
26884
|
+
if (typeof code !== "string" || code.length === 0)
|
|
26885
|
+
return findings;
|
|
26886
|
+
if (!/['"]\$where['"]/.test(code))
|
|
26887
|
+
return findings;
|
|
26888
|
+
const lines = code.split(`
|
|
26889
|
+
`);
|
|
26890
|
+
const reqExtractRe = /\b(?:request\.(?:args|form|values|json|files|cookies|headers|data)\b|flask\.request\b)/;
|
|
26891
|
+
const taintedVars = new Set;
|
|
26892
|
+
for (let pass = 0;pass < 3; pass++) {
|
|
26893
|
+
const before = taintedVars.size;
|
|
26894
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26895
|
+
const t = lines[i2].trim();
|
|
26896
|
+
if (t.startsWith("#"))
|
|
26897
|
+
continue;
|
|
26898
|
+
const a = t.match(/^(\w+)\s*=\s*(.+?)$/);
|
|
26899
|
+
if (!a)
|
|
26900
|
+
continue;
|
|
26901
|
+
const lhs = a[1];
|
|
26902
|
+
const rhs = a[2];
|
|
26903
|
+
if (taintedVars.has(lhs))
|
|
26904
|
+
continue;
|
|
26905
|
+
if (reqExtractRe.test(rhs)) {
|
|
26906
|
+
taintedVars.add(lhs);
|
|
26907
|
+
continue;
|
|
26908
|
+
}
|
|
26909
|
+
for (const v of taintedVars) {
|
|
26910
|
+
if (new RegExp(`\\b${v}\\b`).test(rhs)) {
|
|
26911
|
+
taintedVars.add(lhs);
|
|
26912
|
+
break;
|
|
26913
|
+
}
|
|
26914
|
+
}
|
|
26915
|
+
}
|
|
26916
|
+
if (taintedVars.size === before)
|
|
26917
|
+
break;
|
|
26918
|
+
}
|
|
26919
|
+
const whereRe = /['"]\$where['"]\s*:\s*([^,}\n]+)/;
|
|
26920
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26921
|
+
const line = lines[i2];
|
|
26922
|
+
const m = line.match(whereRe);
|
|
26923
|
+
if (!m)
|
|
26924
|
+
continue;
|
|
26925
|
+
const valueExpr = m[1].trim();
|
|
26926
|
+
if (/^"[^"]*"$/.test(valueExpr) || /^'[^']*'$/.test(valueExpr))
|
|
26927
|
+
continue;
|
|
26928
|
+
let tainted = reqExtractRe.test(valueExpr);
|
|
26929
|
+
if (!tainted) {
|
|
26930
|
+
for (const v of taintedVars) {
|
|
26931
|
+
if (new RegExp(`\\b${v}\\b`).test(valueExpr)) {
|
|
26932
|
+
tainted = true;
|
|
26933
|
+
break;
|
|
26934
|
+
}
|
|
26935
|
+
}
|
|
26936
|
+
}
|
|
26937
|
+
if (!tainted)
|
|
26938
|
+
continue;
|
|
26939
|
+
findings.push({
|
|
26940
|
+
id: `nosql_injection-${file}-${i2 + 1}-py-mongoengine-where`,
|
|
26941
|
+
pass: "language-sources",
|
|
26942
|
+
category: "security",
|
|
26943
|
+
rule_id: "nosql_injection",
|
|
26944
|
+
cwe: "CWE-943",
|
|
26945
|
+
severity: "critical",
|
|
26946
|
+
level: "error",
|
|
26947
|
+
message: 'NoSQL injection: mongoengine `__raw__={"$where": ...}` payload ' + "derived from HTTP request input. The `$where` operator evaluates " + "JavaScript on the server; tainted string concatenation lets an " + "attacker inject arbitrary JS. Replace `$where` with field-based " + "operators or validate the input.",
|
|
26948
|
+
file,
|
|
26949
|
+
line: i2 + 1,
|
|
26950
|
+
snippet: line.trim()
|
|
26951
|
+
});
|
|
26952
|
+
}
|
|
26953
|
+
return findings;
|
|
26954
|
+
}
|
|
26955
|
+
function findJavaUrlOpenStreamSsrfFindings(code, file) {
|
|
26956
|
+
const findings = [];
|
|
26957
|
+
if (typeof code !== "string" || code.length === 0)
|
|
26958
|
+
return findings;
|
|
26959
|
+
if (!/\bnew\s+URL\s*\(/.test(code) && !/\bURI\s*\.\s*create\s*\(/.test(code)) {
|
|
26960
|
+
return findings;
|
|
26961
|
+
}
|
|
26962
|
+
if (!/\.\s*(?:openStream|openConnection|getContent)\s*\(/.test(code)) {
|
|
26963
|
+
return findings;
|
|
26964
|
+
}
|
|
26965
|
+
const lines = code.split(`
|
|
26966
|
+
`);
|
|
26967
|
+
const reqExtractRe = /\b\w+\s*\.\s*(?:getParameter|getParameterValues|getHeader|getHeaders|getCookies|getReader|getQueryString|getRequestURI|getInputStream|getPart|getParts)\s*\(/;
|
|
26968
|
+
const taintedVars = new Set;
|
|
26969
|
+
for (let pass = 0;pass < 3; pass++) {
|
|
26970
|
+
const before = taintedVars.size;
|
|
26971
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26972
|
+
const t = lines[i2].trim();
|
|
26973
|
+
const a = t.match(/^(?:final\s+)?(?:[\w<>?,\[\]]+\s+)?(\w+)\s*=\s*(.+?);?$/);
|
|
26974
|
+
if (!a)
|
|
26975
|
+
continue;
|
|
26976
|
+
const lhs = a[1];
|
|
26977
|
+
const rhs = a[2];
|
|
26978
|
+
if (taintedVars.has(lhs))
|
|
26979
|
+
continue;
|
|
26980
|
+
if (reqExtractRe.test(rhs)) {
|
|
26981
|
+
taintedVars.add(lhs);
|
|
26982
|
+
continue;
|
|
26983
|
+
}
|
|
26984
|
+
for (const v of taintedVars) {
|
|
26985
|
+
if (new RegExp(`\\b${v}\\b`).test(rhs)) {
|
|
26986
|
+
taintedVars.add(lhs);
|
|
26987
|
+
break;
|
|
26988
|
+
}
|
|
26989
|
+
}
|
|
26990
|
+
}
|
|
26991
|
+
if (taintedVars.size === before)
|
|
26992
|
+
break;
|
|
26993
|
+
}
|
|
26994
|
+
if (taintedVars.size === 0)
|
|
26995
|
+
return findings;
|
|
26996
|
+
const sinkRe = /\.\s*(openStream|openConnection|getContent)\s*\(/;
|
|
26997
|
+
const seen = new Set;
|
|
26998
|
+
for (let i2 = 0;i2 < lines.length; i2++) {
|
|
26999
|
+
const line = lines[i2];
|
|
27000
|
+
const m = line.match(sinkRe);
|
|
27001
|
+
if (!m)
|
|
27002
|
+
continue;
|
|
27003
|
+
const op = m[1];
|
|
27004
|
+
const sinkIdx = line.indexOf(`.${op}`);
|
|
27005
|
+
if (sinkIdx < 0)
|
|
27006
|
+
continue;
|
|
27007
|
+
const head = line.substring(0, sinkIdx + 1);
|
|
27008
|
+
let tainted = reqExtractRe.test(head);
|
|
27009
|
+
if (!tainted) {
|
|
27010
|
+
for (const v of taintedVars) {
|
|
27011
|
+
if (new RegExp(`\\b${v}\\b`).test(head)) {
|
|
27012
|
+
tainted = true;
|
|
27013
|
+
break;
|
|
27014
|
+
}
|
|
27015
|
+
}
|
|
27016
|
+
}
|
|
27017
|
+
if (!tainted)
|
|
27018
|
+
continue;
|
|
27019
|
+
const key = `${i2 + 1}:${op}`;
|
|
27020
|
+
if (seen.has(key))
|
|
27021
|
+
continue;
|
|
27022
|
+
seen.add(key);
|
|
27023
|
+
findings.push({
|
|
27024
|
+
id: `ssrf-${file}-${i2 + 1}-java-url-${op.toLowerCase()}`,
|
|
27025
|
+
pass: "language-sources",
|
|
27026
|
+
category: "security",
|
|
27027
|
+
rule_id: "ssrf",
|
|
27028
|
+
cwe: "CWE-918",
|
|
27029
|
+
severity: "critical",
|
|
27030
|
+
level: "error",
|
|
27031
|
+
message: `SSRF: Java \`URL.${op}()\` invoked on a URL derived from servlet ` + 'request input. Even when an `if (url.startsWith("https://"))` ' + "guard is present, the host portion remains attacker-controlled — " + "use a strict host allowlist (parse the URL, check `getHost()`) " + "before issuing the request.",
|
|
27032
|
+
file,
|
|
27033
|
+
line: i2 + 1,
|
|
27034
|
+
snippet: line.trim()
|
|
27035
|
+
});
|
|
27036
|
+
}
|
|
27037
|
+
return findings;
|
|
27038
|
+
}
|
|
26683
27039
|
|
|
26684
27040
|
// ../circle-ir/dist/analysis/passes/sink-filter-pass.js
|
|
26685
27041
|
var JS_XSS_SANITIZERS = [
|
|
@@ -39807,7 +40163,7 @@ var colors = {
|
|
|
39807
40163
|
};
|
|
39808
40164
|
|
|
39809
40165
|
// src/version.ts
|
|
39810
|
-
var version = "3.
|
|
40166
|
+
var version = "3.135.0";
|
|
39811
40167
|
|
|
39812
40168
|
// src/formatters.ts
|
|
39813
40169
|
var LIBRARY_API_SURFACE_TAG2 = "library-api-surface:caller-responsibility";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cognium-dev",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.135.0",
|
|
4
4
|
"description": "Static Application Security Testing CLI for detecting security vulnerabilities via taint tracking",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@cognium/project-profile-detect": "^1.1.0",
|
|
69
|
-
"circle-ir": "^3.
|
|
69
|
+
"circle-ir": "^3.135.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@types/node": "^25.5.0",
|