Skip to content

Commit eb7fe71

Browse files
Fix namespace instances and update tests
1 parent 83eadba commit eb7fe71

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

python/ql/lib/semmle/python/frameworks/Socketio.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ module SocketIO {
8888
}
8989

9090
/** Gets a reference to an instance of a subclass of `socketio.Namespace` or `socketio.AsyncNamespace`. */
91-
API::Node instance() { result = subclassRef().getAnInstance() }
91+
API::Node instance() {
92+
result = subclassRef().getAnInstance()
93+
or
94+
result = subclassRef().getAMember().getSelfParameter()
95+
}
9296

9397
/** A socketio Namespace class. */
9498
class NamespaceClass extends Class {

python/ql/test/library-tests/frameworks/socketio/taint_test.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,45 @@ def event1(sid, data): # $ requestHandler routedParameter=data
2222
ensure_tainted(data) # $ tainted
2323
res = sio.call("e1", sid=sid)
2424
ensure_tainted(res) # $ tainted
25-
sio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
26-
sio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
25+
sio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
26+
sio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
2727

2828
class MyNamespace(socketio.Namespace):
2929
def on_event2(self, sid, data): # $ requestHandler routedParameter=data
3030
ensure_not_tainted(self, sid)
31-
ensure_tainted(data)
31+
ensure_tainted(data) # $ tainted
3232
res = self.call("e1", sid=sid)
3333
ensure_tainted(res) # $ tainted
34-
self.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
35-
self.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
34+
self.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
35+
self.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
3636

3737
sio.register_namespace(MyNamespace("/ns"))
3838

3939
asio = socketio.AsyncServer(async_mode='asgi')
4040

4141
@asio.event
42-
async def event3(sid, data): # $ requestHandler routedParameter=sid routedParameter=data
42+
async def event3(sid, data): # $ requestHandler routedParameter=data
4343
ensure_not_tainted(sid)
4444
ensure_tainted(data) # $ tainted
4545
res = await asio.call("e1", sid=sid)
4646
ensure_tainted(res) # $ tainted
47-
await asio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
48-
await asio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted
47+
await asio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
48+
await asio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
49+
50+
class MyAsyncNamespace(socketio.AsyncNamespace):
51+
async def on_event4(self, sid, data): # $ requestHandler routedParameter=data
52+
ensure_not_tainted(self, sid)
53+
ensure_tainted(data) # $ tainted
54+
res = await self.call("e1", sid=sid)
55+
ensure_tainted(res) # $ tainted
56+
await self.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
57+
await self.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x
58+
59+
asio.register_namespace(MyAsyncNamespace("/ns"))
4960

5061
if __name__ == "__main__":
5162

52-
if "--async" in sys.argv:
63+
if "--async" in sys.argv: # $ threatModelSource[commandargs]=sys.argv
5364
import uvicorn
5465
app = socketio.ASGIApp(asio)
5566
uvicorn.run(app, host='127.0.0.1', port=8000)

0 commit comments

Comments
 (0)