diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index a722f3395fb..965ef44ee27 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -1299,20 +1299,35 @@ module StdlibPrivate { // --------------------------------------------------------------------------- /** Gets a reference to any of the `pickle` modules. */ API::Node pickle() { - result = API::moduleImport(["pickle", "cPickle", "_pickle", "cloudpickle"]) or - result = API::moduleImport("kombu").getMember("serialization").getMember("pickle") + result = API::moduleImport(["pickle", "cPickle", "_pickle"]) + or + result = ModelOutput::getATypeNode("pickle~Alias") + } + + /** + * A reference to `pickle.load` + */ + API::Node pickle_load() { + result = pickle().getMember("load") + or + result = ModelOutput::getATypeNode("pickle.load~Alias") + } + + /** + * A reference to `pickle.loads` + */ + API::Node pickle_loads() { + result = pickle().getMember("loads") + or + result = ModelOutput::getATypeNode("pickle.loads~Alias") } /** * A call to `pickle.load` * See https://docs.python.org/3/library/pickle.html#pickle.load */ - private class PickleLoadCall extends Decoding::Range, DataFlow::CallCfgNode { - PickleLoadCall() { - this = pickle().getMember("load").getACall() or - this = - API::moduleImport("kombu").getMember("serialization").getMember("pickle_load").getACall() - } + private class PickleLoadCall extends Decoding::Range, API::CallNode { + PickleLoadCall() { this = pickle_load().getACall() } override predicate mayExecuteInput() { any() } @@ -1327,8 +1342,8 @@ module StdlibPrivate { * A call to `pickle.loads` * See https://docs.python.org/3/library/pickle.html#pickle.loads */ - private class PickleLoadsCall extends Decoding::Range, DataFlow::CallCfgNode { - PickleLoadsCall() { this = pickle().getMember("loads").getACall() } + private class PickleLoadsCall extends Decoding::Range, API::CallNode { + PickleLoadsCall() { this = pickle_loads().getACall() } override predicate mayExecuteInput() { any() } diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/auto-cloudpickle.model.yml b/python/ql/lib/semmle/python/frameworks/data/internal/auto-cloudpickle.model.yml new file mode 100644 index 00000000000..fbe180ff251 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/data/internal/auto-cloudpickle.model.yml @@ -0,0 +1,24 @@ +# process-mrva-results 0.0.1 +extensions: +- addsTo: + extensible: typeModel + pack: codeql/python-all + data: + - - pickle.loads~Alias + - cloudpickle + - Member[cloudpickle].Member[loads] + - - pickle.loads~Alias + - cloudpickle + - Member[cloudpickle_fast].Member[loads] + - - pickle.loads~Alias + - cloudpickle + - Member[loads] + - - pickle.load~Alias + - cloudpickle + - Member[cloudpickle].Member[load] + - - pickle.load~Alias + - cloudpickle + - Member[cloudpickle_fast].Member[load] + - - pickle.load~Alias + - cloudpickle + - Member[load] diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/auto-kombu.model.yml b/python/ql/lib/semmle/python/frameworks/data/internal/auto-kombu.model.yml new file mode 100644 index 00000000000..58c0cca4c27 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/data/internal/auto-kombu.model.yml @@ -0,0 +1,9 @@ +# process-mrva-results 0.0.1 +extensions: +- addsTo: + extensible: typeModel + pack: codeql/python-all + data: + - - pickle~Alias + - kombu + - Member[serialization].Member[pickle] diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index f20fb185d29..869f3ebf07e 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -464,6 +464,24 @@ class LxmlETreeAlias extends FindSubclassesSpec { override API::Node getAlreadyModeledClass() { result = Lxml::etreeRef() } } +class PickleAlias extends FindSubclassesSpec { + PickleAlias() { this = "pickle~Alias" } + + override API::Node getAlreadyModeledClass() { result = StdlibPrivate::pickle() } +} + +class PickleLoadAlias extends FindSubclassesSpec { + PickleLoadAlias() { this = "pickle.load~Alias" } + + override API::Node getAlreadyModeledClass() { result = StdlibPrivate::pickle_load() } +} + +class PickleLoadsAlias extends FindSubclassesSpec { + PickleLoadsAlias() { this = "pickle.loads~Alias" } + + override API::Node getAlreadyModeledClass() { result = StdlibPrivate::pickle_loads() } +} + bindingset[fullyQualified] predicate fullyQualifiedToYamlFormat(string fullyQualified, string type2, string path) { exists(int firstDot | firstDot = fullyQualified.indexOf(".", 0, 0) |