I am trying to adopt your Taint-Style Description example for sprintf but am lost in the mix of python, groovy and germlin. Here is what I try to do:
funs = ['sprintf']
for f in funs:
#find calls of bad function
print "Calls to evil function %s:" % f
calls = j.runGremlinQuery("getCallsTo('%s')" % f)
for c in calls:
#params = j.runGremlinQuery("g.v(%d).callToArguments().filter{ it.childNum!='0' }.definitions().filter{it.type=='Parameter'}"%c._id)
params = j.runGremlinQuery("g.v(%d).callToArguments().filter{ it.childNum!='0' }.sideEffect{ paramName = '.*' }.filter{ it.code.matches(paramName) }.unsanitized{ it.isCheck( paramName ) }.params( paramName )"%c._id)
if set(params):
print "call: %s " % c['code']
print "\tCan be reached from function parameters:"
for p in params:
print "\t\t%s" % p
Traceback (most recent call last):
File "my_query.py", line 23, in <module>
params = j.runGremlinQuery("g.v(%d).callToArguments().filter{ it.childNum!='0' }.sideEffect{ paramName = '.*' }.filter{ it.code.matches(paramName) }.unsanitized{ it.isCheck( paramName ) }.params( paramName )"%c._id)
File "/usr/local/lib/python2.7/dist-packages/joern-0.1-py2.7.egg/joern/all.py", line 44, in runGremlinQuery
return self.gremlin.execute(finalQuery)
File "/usr/local/lib/python2.7/dist-packages/py2neo/ext/gremlin/__init__.py", line 36, in execute
response = self.resources["execute_script"].post({"script": script})
File "/usr/local/lib/python2.7/dist-packages/py2neo/core.py", line 288, in post
raise_from(self.error_class(message, **content), error)
File "/usr/local/lib/python2.7/dist-packages/py2neo/util.py", line 215, in raise_from
raise exception
py2neo.error.BadInputException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: paramName for class: Script26
So it seems like groovy tries to do a replacement here looking for paramName, which is obviously wrong.
How do I need to escape this so groovy stays out of my gremlin code?