Skip to content

Commit 2e4cb63

Browse files
committed
Optimize the Argparse filename as a source.
1 parent f867c90 commit 2e4cb63

2 files changed

Lines changed: 25 additions & 6 deletions

File tree

python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,17 @@ class UnsafeUnpackingConfig extends TaintTracking::Configuration {
2828
// A source coming from a remote location
2929
exists(Http::Client::Request request | source = request)
3030
or
31-
//A source coming from a CLI argparse module
32-
exists(Node o, API::Node ap, MethodCallNode args |
33-
ap = API::moduleImport("argparse").getMember("ArgumentParser").getACall().getReturn() and
34-
args = ap.getMember("parse_args").getACall() and
35-
args.flowsTo(o) and
36-
source.(AttrRead).accesses(o, any(string s))
31+
// A source coming from a CLI argparse module
32+
// see argparse: https://docs.python.org/3/library/argparse.html
33+
exists(MethodCallNode args |
34+
args = source.(AttrRead).getObject().getALocalSource() and
35+
args =
36+
API::moduleImport("argparse")
37+
.getMember("ArgumentParser")
38+
.getACall()
39+
.getReturn()
40+
.getMember("parse_args")
41+
.getACall()
3742
)
3843
or
3944
// A source catching an S3 filename download

python/ql/test/experimental/query-tests/Security/CWE-022/UnsafeUnpack.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,17 @@
8787
# download(url) returns filename
8888
compressed_file = wget.download(url)
8989
shutil.unpack_archive(compressed_file, base_dir) # $result=BAD
90+
91+
92+
# A source coming from a CLI argparse module
93+
# see argparse: https://docs.python.org/3/library/argparse.html
94+
import argparse
95+
96+
parser = argparse.ArgumentParser(description='Process some integers.')
97+
parser.add_argument('integers', metavar='N', type=int, nargs='+',
98+
help='an integer for the accumulator')
99+
parser.add_argument('filename', help='filename to be provided')
100+
101+
args = parser.parse_args()
102+
compressed_file = args.filename
103+
shutil.unpack_archive(compressed_file, base_dir) # $result=BAD

0 commit comments

Comments
 (0)