@@ -61,6 +61,41 @@ private class EnumConstructorPathInjectionSink extends PathInjectionSink {
6161 }
6262}
6363
64+ /**
65+ * A string that might be a label for a path argument.
66+ */
67+ pragma [ inline]
68+ private predicate pathLikeHeuristic ( string label ) {
69+ label =
70+ [
71+ "atFile" , "atPath" , "atDirectory" , "toFile" , "toPath" , "toDirectory" , "inFile" , "inPath" ,
72+ "inDirectory" , "contentsOfFile" , "contentsOfPath" , "contentsOfDirectory" , "filePath" ,
73+ "directory" , "directoryPath"
74+ ]
75+ }
76+
77+ /**
78+ * A path injection sink that is determined by imprecise methods.
79+ */
80+ private class HeuristicPathInjectionSink extends PathInjectionSink {
81+ HeuristicPathInjectionSink ( ) {
82+ // by parameter name
83+ exists ( CallExpr ce , int ix , ParamDecl pd |
84+ pathLikeHeuristic ( pragma [ only_bind_into ] ( pd .getName ( ) ) ) and
85+ pd .getType ( ) .getUnderlyingType ( ) .getName ( ) = [ "String" , "NSString" ] and
86+ pd = ce .getStaticTarget ( ) .getParam ( ix ) and
87+ this .asExpr ( ) = ce .getArgument ( ix ) .getExpr ( )
88+ )
89+ or
90+ // by argument name
91+ exists ( Argument a |
92+ pathLikeHeuristic ( pragma [ only_bind_into ] ( a .getLabel ( ) ) ) and
93+ a .getExpr ( ) .getType ( ) .getUnderlyingType ( ) .getName ( ) = [ "String" , "NSString" ] and
94+ this .asExpr ( ) = a .getExpr ( )
95+ )
96+ }
97+ }
98+
6499private class DefaultPathInjectionBarrier extends PathInjectionBarrier {
65100 DefaultPathInjectionBarrier ( ) {
66101 // This is a simplified implementation.
@@ -87,7 +122,14 @@ private class PathInjectionSinks extends SinkModelCsv {
87122 override predicate row ( string row ) {
88123 row =
89124 [
125+ ";Data;true;init(contentsOf:options:);;;Argument[0];path-injection" ,
90126 ";Data;true;write(to:options:);;;Argument[0];path-injection" ,
127+ ";NSData;true;init(contentsOfFile:);;;Argument[0];path-injection" ,
128+ ";NSData;true;init(contentsOfFile:options:);;;Argument[0];path-injection" ,
129+ ";NSData;true;init(contentsOf:);;;Argument[0];path-injection" ,
130+ ";NSData;true;init(contentsOf:options:);;;Argument[0];path-injection" ,
131+ ";NSData;true;init(contentsOfMappedFile:);;;Argument[0];path-injection" ,
132+ ";NSData;true;dataWithContentsOfMappedFile(_:);;;Argument[0];path-injection" ,
91133 ";NSData;true;write(to:atomically:);;;Argument[0];path-injection" ,
92134 ";NSData;true;write(to:options:);;;Argument[0];path-injection" ,
93135 ";NSData;true;write(toFile:atomically:);;;Argument[0];path-injection" ,
@@ -118,12 +160,14 @@ private class PathInjectionSinks extends SinkModelCsv {
118160 ";FileManager;true;fileExists(atPath:);;;Argument[0];path-injection" ,
119161 ";FileManager;true;fileExists(atPath:isDirectory:);;;Argument[0];path-injection" ,
120162 ";FileManager;true;setAttributes(_:ofItemAtPath:);;;Argument[1];path-injection" ,
163+ ";FileManager;true;attributesOfItem(atPath:);;;Argument[0];path-injection" ,
121164 ";FileManager;true;contents(atPath:);;;Argument[0];path-injection" ,
122165 ";FileManager;true;contentsEqual(atPath:andPath:);;;Argument[0..1];path-injection" ,
123166 ";FileManager;true;changeCurrentDirectoryPath(_:);;;Argument[0];path-injection" ,
124167 ";FileManager;true;unmountVolume(at:options:completionHandler:);;;Argument[0];path-injection" ,
125168 // Deprecated FileManager methods:
126169 ";FileManager;true;changeFileAttributes(_:atPath:);;;Argument[1];path-injection" ,
170+ ";FileManager;true;fileAttributes(atPath:traverseLink:);;;Argument[0];path-injection" ,
127171 ";FileManager;true;directoryContents(atPath:);;;Argument[0];path-injection" ,
128172 ";FileManager;true;createDirectory(atPath:attributes:);;;Argument[0];path-injection" ,
129173 ";FileManager;true;createSymbolicLink(atPath:pathContent:);;;Argument[0..1];path-injection" ,
@@ -146,6 +190,7 @@ private class PathInjectionSinks extends SinkModelCsv {
146190 ";ArchiveByteStream;true;withFileStream(path:mode:options:permissions:_:);;;Argument[0];path-injection" ,
147191 ";Bundle;true;init(url:);;;Argument[0];path-injection" ,
148192 ";Bundle;true;init(path:);;;Argument[0];path-injection" ,
193+ ";NSURL;writeBookmarkData(_:to:options:);;;Argument[1];path-injection" ,
149194 // GRDB
150195 ";Database;true;init(path:description:configuration:);;;Argument[0];path-injection" ,
151196 ";DatabasePool;true;init(path:configuration:);;;Argument[0];path-injection" ,
0 commit comments