CVE-2024-39780 is a high severity (CVSS 7.8) YAML deserialization flaw in the ROS dynparam command line tool for Noetic and earlier. The set and get verbs used yaml.load, which can create arbitrary Python objects. A fix that switches to yaml.safe_load was merged into the dynamic_reconfigure noetic-devel branch.
What's affected
Per the NVD record, the Robot Operating System tool dynparam is affected in ROS distributions Noetic and earlier. The unsafe call is yaml.load in the set and get verbs.
The upstream fix is pull request 202 in the ros/dynamic_reconfigure repository, titled Fix unsafe yaml load on dynparam. The page shows it merged into noetic-devel. The pull request describes switching to yaml.safe_load, which is the safe loader in the PyYAML library.
I could not confirm a released package version that contains the change. Check the dynamic_reconfigure release notes and your distribution's package changelog before you rely on a version number.
How to check if you're exposed
On a ROS machine, list the installed package version:
rosversion dynamic_reconfigure
On Debian or Ubuntu with ROS Noetic packages, the package manager shows the version too:
dpkg -l ros-noetic-dynamic-reconfigure
To find the unsafe call in code you maintain, search your own sources and any vendored copies:
grep -rn "yaml.load(" --include=*.py .
Any hit that parses data from outside your trust boundary needs review. Calls that pass an explicit safe loader are fine.
What to do now
- Update dynamic_reconfigure to a release that includes the pull request 202 change. Confirm in the release notes.
- Until then, do not run dynparam set or get with parameter values from untrusted sources, scripts or other machines.
- Search your own ROS packages and launch tooling for yaml.load calls and replace them with yaml.safe_load.
- Run dependency scans on ROS workspaces so old packages show up in a list, not by accident.
- Treat old ROS distributions that no longer get updates as a risk and plan a migration.
Why it matters
The weaknesses are CWE-502, deserialization of untrusted data, and CWE-20, improper input validation. PyYAML's plain load function can build any Python object a document asks for, which includes calling functions. The library's own documentation warns against using it on untrusted input.
A robot or lab machine often takes parameters from scripts, files and other nodes. If one of those sources is compromised, a parameter string becomes code. The fix is a one-word change, from load to safe_load, and the same change is worth making anywhere you parse YAML you did not write.
Try it yourself
A static code scan can flag unsafe yaml.load calls before they ship. This demo shows what such a scan reports.
Click through it at your own pace, or open it full screen.
Quick check
What is the difference between yaml.load and yaml.safe_load?
safe_load builds only plain data types such as strings, numbers, lists and maps. load can construct arbitrary Python objects and should not touch untrusted input.
Sources
Last reviewed: 19 October 2026.