-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Java: Update qhelp: SnakeYaml is safe from version 2.0 #20018
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Java: Update qhelp: SnakeYaml is safe from version 2.0 #20018
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR updates the documentation for the java/unsafe-deserialization
query to reflect that SnakeYAML is secure by default starting from version 2.0. The change clarifies that the previous vulnerability recommendations only apply to versions before 2.0, since all constructors now extend SafeConstructor
in version 2.0 and later.
- Updates SnakeYAML security status from "No" to "As of version 2.0"
- Modifies the recommendation to specify it only applies to versions before 2.0
QHelp previews: java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelpDeserialization of user-controlled dataDeserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code. There are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson, JMS, and Java IO serialization through RecommendationAvoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder. Alternatively, a tightly controlled whitelist can limit the vulnerability of code, but be aware of the existence of so-called Bypass Gadgets, which can circumvent such protection measures. Recommendations specific to particular frameworks supported by this query: FastJson -
FasterXML -
Kryo -
ObjectInputStream -
SnakeYAML -
XML Decoder -
ObjectMesssage -
ExampleThe following example calls public MyObject {
public int field;
MyObject(int field) {
this.field = field;
}
}
public MyObject deserialize(Socket sock) {
try(ObjectInputStream in = new ObjectInputStream(sock.getInputStream())) {
return (MyObject)in.readObject(); // BAD: in is from untrusted source
}
} Rewriting the communication protocol to only rely on reading primitive types from the input stream removes the vulnerability. public MyObject deserialize(Socket sock) {
try(DataInputStream in = new DataInputStream(sock.getInputStream())) {
return new MyObject(in.readInt()); // GOOD: read only an int
}
} References
|
Is the link on line 124 still accurate as well? |
Good question. The link still seems to work, and to link to SnakeYaml documentation. But it seems the documentation hasn't been updated for the new behaviour since version 2.0. E.g. it still says:
There is a note at the top of the file that "This documentation is very brief and incomplete. Feel free to fix or improve it." The options are to delete the link because it is confusing, or add a note like "(not updated for new behaviour in version 2.0)". I'm leaning towards the latter. What do you think, @JLLeitschuh ? |
It was brought to our attention in #19664 that SnakeYaml is not vulnerable to
java/unsafe-deserialization
as of version 2.0 (released in 2023). This is because all constructors now extendSafeConstructor
. We already had an exclusion for constructors which extendSafeConstructor
, so the query does not need to be updated. This PR updates the qhelp file.