Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions java/change-notes/2021-06-29-javax-json-models.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
lgtm,codescanning
* Added models of `javax.json` classes and methods. This may lead to more results where tracking tainted dataflow across JSON encoding or decoding is needed to diagnose a security or other issue.
1 change: 1 addition & 0 deletions java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ private module Frameworks {
private import semmle.code.java.frameworks.apache.Lang
private import semmle.code.java.frameworks.guava.Guava
private import semmle.code.java.frameworks.jackson.JacksonSerializability
private import semmle.code.java.frameworks.JavaxJson
private import semmle.code.java.frameworks.JaxWS
private import semmle.code.java.frameworks.Optional
private import semmle.code.java.frameworks.spring.SpringHttp
Expand Down
138 changes: 138 additions & 0 deletions java/ql/src/semmle/code/java/frameworks/JavaxJson.qll
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/**
* Provides models for the `javax.json` and `jakarta.json` packages.
*/

import java
private import semmle.code.java.dataflow.ExternalFlow

private class FlowSummaries extends SummaryModelCsv {
override predicate row(string row) {
row =
["javax", "jakarta"] +
[
".json;Json;false;createArrayBuilder;(JsonArray);;Argument[0];ReturnValue;taint",
".json;Json;false;createArrayBuilder;(Collection);;Element of Argument[0];ReturnValue;taint",
".json;Json;false;createDiff;;;Argument[0..1];ReturnValue;taint",
".json;Json;false;createMergeDiff;;;Argument[0..1];ReturnValue;taint",
".json;Json;false;createMergePatch;;;Argument[0];ReturnValue;taint",
".json;Json;false;createObjectBuilder;(JsonObject);;Argument[0];ReturnValue;taint",
".json;Json;false;createObjectBuilder;(Map);;MapKey of Argument[0];ReturnValue;taint",
".json;Json;false;createObjectBuilder;(Map);;MapValue of Argument[0];ReturnValue;taint",
".json;Json;false;createPatch;;;Argument[0];ReturnValue;taint",
".json;Json;false;createPatchBuilder;;;Argument[0];ReturnValue;taint",
".json;Json;false;createPointer;;;Argument[0];ReturnValue;taint",
".json;Json;false;createReader;;;Argument[0];ReturnValue;taint",
".json;Json;false;createValue;;;Argument[0];ReturnValue;taint",
".json;Json;false;createWriter;;;Argument[0];ReturnValue;taint",
".json;Json;false;decodePointer;;;Argument[0];ReturnValue;taint",
".json;Json;false;encodePointer;;;Argument[0];ReturnValue;taint",
".json;JsonArray;false;getBoolean;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getBoolean;;;Argument[1];ReturnValue;value",
".json;JsonArray;false;getInt;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getInt;;;Argument[1];ReturnValue;value",
".json;JsonArray;false;getJsonArray;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getJsonNumber;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getJsonObject;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getJsonString;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getString;;;Argument[-1];ReturnValue;taint",
".json;JsonArray;false;getString;;;Argument[1];ReturnValue;value",
".json;JsonArray;false;getValuesAs;;;Argument[-1];ReturnValue;taint",
".json;JsonArrayBuilder;false;add;;;Argument[-1];ReturnValue;value",
".json;JsonArrayBuilder;false;add;(boolean);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(double);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(long);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(JsonArrayBuilder);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(JsonObjectBuilder);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(JsonValue);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(String);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(BigDecimal);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(BigInteger);;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,boolean);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,double);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,int);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,long);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,JsonArrayBuilder);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,JsonObjectBuilder);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,JsonValue);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,String);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,BigDecimal);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;add;(int,BigInteger);;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;addAll;;;Argument[0];Argument[-1];taint",
".json;JsonArrayBuilder;false;addAll;;;Argument[-1];ReturnValue;value",
".json;JsonArrayBuilder;false;addNull;;;Argument[-1];ReturnValue;value",
".json;JsonArrayBuilder;false;build;;;Argument[-1];ReturnValue;taint",
".json;JsonArrayBuilder;false;remove;;;Argument[-1];ReturnValue;value",
".json;JsonArrayBuilder;false;set;;;Argument[1];Argument[-1];taint",
".json;JsonArrayBuilder;false;set;;;Argument[-1];ReturnValue;value",
".json;JsonArrayBuilder;false;setNull;;;Argument[-1];ReturnValue;value",
".json;JsonMergePatch;false;apply;;;Argument[-1];ReturnValue;taint",
".json;JsonMergePatch;false;apply;;;Argument[0];ReturnValue;taint",
".json;JsonMergePatch;false;toJsonValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;bigDecimalValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;bigIntegerValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;bigIntegerValueExact;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;doubleValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;intValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;intValueExact;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;longValue;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;longValueExact;;;Argument[-1];ReturnValue;taint",
".json;JsonNumber;false;numberValue;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getBoolean;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getBoolean;;;Argument[1];ReturnValue;value",
".json;JsonObject;false;getInt;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getInt;;;Argument[1];ReturnValue;value",
".json;JsonObject;false;getJsonArray;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getJsonNumber;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getJsonObject;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getJsonString;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getString;;;Argument[-1];ReturnValue;taint",
".json;JsonObject;false;getString;;;Argument[1];ReturnValue;value",
".json;JsonObjectBuilder;false;add;;;Argument[-1];ReturnValue;value",
".json;JsonObjectBuilder;false;add;;;Argument[1];Argument[-1];taint",
".json;JsonObjectBuilder;false;addAll;;;Argument[0];ReturnValue;value",
".json;JsonObjectBuilder;false;addAll;;;Argument[-1];ReturnValue;value",
".json;JsonObjectBuilder;false;addNull;;;Argument[-1];ReturnValue;value",
".json;JsonObjectBuilder;false;build;;;Argument[-1];ReturnValue;taint",
".json;JsonObjectBuilder;false;remove;;;Argument[-1];ReturnValue;value",
".json;JsonPatch;false;apply;;;Argument[-1];ReturnValue;taint",
".json;JsonPatch;false;apply;;;Argument[0];ReturnValue;taint",
".json;JsonPatch;false;toJsonArray;;;Argument[-1];ReturnValue;taint",
".json;JsonPatchBuilder;false;add;;;Argument[0..1];ReturnValue;taint",
".json;JsonPatchBuilder;false;add;;;Argument[-1];ReturnValue;value",
".json;JsonPatchBuilder;false;build;;;Argument[-1];ReturnValue;taint",
".json;JsonPatchBuilder;false;copy;;;Argument[0..1];ReturnValue;taint",
".json;JsonPatchBuilder;false;copy;;;Argument[-1];ReturnValue;value",
".json;JsonPatchBuilder;false;move;;;Argument[0..1];ReturnValue;taint",
".json;JsonPatchBuilder;false;move;;;Argument[-1];ReturnValue;value",
".json;JsonPatchBuilder;false;remove;;;Argument[0];ReturnValue;taint",
".json;JsonPatchBuilder;false;remove;;;Argument[-1];ReturnValue;value",
".json;JsonPatchBuilder;false;replace;;;Argument[0..1];ReturnValue;taint",
".json;JsonPatchBuilder;false;replace;;;Argument[-1];ReturnValue;value",
".json;JsonPatchBuilder;false;test;;;Argument[0..1];ReturnValue;taint",
".json;JsonPatchBuilder;false;test;;;Argument[-1];ReturnValue;value",
".json;JsonPointer;false;add;;;Argument[-1];ReturnValue;taint",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is add really transferring taint from the receiver JsonPointer?
If so should that then in the same way apply to the other methods (getValue, remove, replace)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add: yes, because the pointer could contain an injection string, which would be incorporated into the result as a new key. getValue, remove, replace: no, they do not incorporate text from the pointer into the result (replace requires that the key is already present)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the clarification! Makes sense.

".json;JsonPointer;false;add;;;Argument[0..1];ReturnValue;taint",
".json;JsonPointer;false;getValue;;;Argument[0];ReturnValue;taint",
".json;JsonPointer;false;remove;;;Argument[0];ReturnValue;taint",
".json;JsonPointer;false;replace;;;Argument[0..1];ReturnValue;taint",
".json;JsonPointer;false;toString;;;Argument[-1];ReturnValue;taint",
".json;JsonReader;false;read;;;Argument[-1];ReturnValue;taint",
".json;JsonReader;false;readArray;;;Argument[-1];ReturnValue;taint",
".json;JsonReader;false;readObject;;;Argument[-1];ReturnValue;taint",
".json;JsonReader;false;readValue;;;Argument[-1];ReturnValue;taint",
".json;JsonReaderFactory;false;createReader;;;Argument[0];ReturnValue;taint",
".json;JsonString;false;getChars;;;Argument[-1];ReturnValue;taint",
".json;JsonString;false;getString;;;Argument[-1];ReturnValue;taint",
".json;JsonStructure;true;getValue;;;Argument[-1];ReturnValue;taint",
".json;JsonValue;true;asJsonArray;;;Argument[-1];ReturnValue;taint",
".json;JsonValue;true;asJsonObject;;;Argument[-1];ReturnValue;taint",
".json;JsonValue;true;toString;;;Argument[-1];ReturnValue;taint",
".json;JsonWriter;false;write;;;Argument[0];Argument[-1];taint",
".json;JsonWriter;false;writeArray;;;Argument[0];Argument[-1];taint",
".json;JsonWriter;false;writeObject;;;Argument[0];Argument[-1];taint",
".json;JsonWriterFactory;false;createWriter;;;Argument[-1];Argument[0];taint",
".json.stream;JsonParserFactory;false;createParser;;;Argument[0];ReturnValue;taint"
]
}
}
Loading