Create rule S6985 : Usage of "torch.load" can lead to untrusted code execution (#3976)
* Create rule S6985 * add implementation details * Address review * Update rule to include details about the wheights_only parameter * Remove unnecessary example --------- Co-authored-by: ghislainpiot <ghislainpiot@users.noreply.github.com> Co-authored-by: Ghislain Piot <ghislain.piot@sonarsource.com> Co-authored-by: Sebastian Zumbrunn <sebastian.zumbrunn@sonarsource.com>
This commit is contained in:
parent
58c6c084e6
commit
7f75840e19
2
rules/S6985/metadata.json
Normal file
2
rules/S6985/metadata.json
Normal file
@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
25
rules/S6985/python/metadata.json
Normal file
25
rules/S6985/python/metadata.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"title": "Usage of \"torch.load\" can lead to untrusted code execution",
|
||||
"type": "SECURITY_HOTSPOT",
|
||||
"status": "ready",
|
||||
"remediation": {
|
||||
"func": "Constant\/Issue",
|
||||
"constantCost": "15min"
|
||||
},
|
||||
"tags": [
|
||||
"pytorch",
|
||||
"machine-learning"
|
||||
],
|
||||
"defaultSeverity": "Major",
|
||||
"ruleSpecification": "RSPEC-6985",
|
||||
"sqKey": "S6985",
|
||||
"scope": "All",
|
||||
"defaultQualityProfiles": ["Sonar way"],
|
||||
"quickfix": "infeasible",
|
||||
"code": {
|
||||
"impacts": {
|
||||
"SECURITY": "HIGH"
|
||||
},
|
||||
"attribute": "CONVENTIONAL"
|
||||
}
|
||||
}
|
64
rules/S6985/python/rule.adoc
Normal file
64
rules/S6985/python/rule.adoc
Normal file
@ -0,0 +1,64 @@
|
||||
This rule raises an issue when `pytorch.load` is used to load a model.
|
||||
|
||||
== Why is this an issue?
|
||||
|
||||
In PyTorch, it is common to load serialized models using the `torch.load` function.
|
||||
Under the hood, `torch.load` uses the `pickle` library to load the model and the weights.
|
||||
If the model comes from an untrusted source, an attacker could inject a malicious payload which would be executed during the deserialization.
|
||||
|
||||
== How to fix it
|
||||
|
||||
Use a safer alternative to load the model, such as `safetensors.torch.load_model`. Alternatively, PyTorch can be instructed to only load
|
||||
the weights by setting the parameter `weights_only=True`. This avoids the use of the `pickle` library and is therefore safe. Note that the
|
||||
use of `weights_only` requires saving only the `state_dict` of a model instead of the whole model.
|
||||
|
||||
=== Code examples
|
||||
|
||||
==== Noncompliant code example
|
||||
|
||||
[source,python,diff-id=1,diff-type=noncompliant]
|
||||
----
|
||||
import torch
|
||||
|
||||
model = torch.load('model.pth') # Noncompliant: torch.load is used to load the model
|
||||
----
|
||||
|
||||
==== Compliant solution
|
||||
|
||||
[source,python,diff-id=1,diff-type=compliant]
|
||||
----
|
||||
import torch
|
||||
import safetensors
|
||||
|
||||
model = MyModel()
|
||||
safetensors.torch.load_model(model, 'model.pth')
|
||||
----
|
||||
|
||||
== Resources
|
||||
=== Documentation
|
||||
|
||||
* Pytorch documentation: https://pytorch.org/tutorials/beginner/saving_loading_models.html#save-load-entire-model[Save/Load Entire Model]
|
||||
|
||||
|
||||
ifdef::env-github,rspecator-view[]
|
||||
|
||||
(visible only on this page)
|
||||
|
||||
== Implementation specification
|
||||
|
||||
All usages of torch.load
|
||||
|
||||
=== Message
|
||||
|
||||
Primary : Replace this call with a safe alternative
|
||||
|
||||
|
||||
=== Issue location
|
||||
|
||||
Primary : name of the function call
|
||||
|
||||
=== Quickfix
|
||||
|
||||
No
|
||||
|
||||
endif::env-github,rspecator-view[]
|
Loading…
x
Reference in New Issue
Block a user