From c18ad9a007dbf1759c957bd1dd815967250ebd64 Mon Sep 17 00:00:00 2001 From: Artem Smotrakov Date: Sat, 10 Jul 2021 06:42:31 +0200 Subject: [PATCH] HADOOP-17793. Better token validation (#3189) Signed-off-by: Akira Ajisaka (cherry picked from commit ba325a8ada573291266c4d6447862072fdf88af5) --- .../main/java/org/apache/hadoop/security/token/Token.java | 6 +++--- .../hdfs/security/token/block/BlockTokenSecretManager.java | 5 +++-- .../nodemanager/containermanager/ContainerManagerImpl.java | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/Token.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/Token.java index e521a7c07b9..0141af8237b 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/Token.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/token/Token.java @@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory; import java.io.*; -import java.util.Arrays; +import java.security.MessageDigest; import java.util.Iterator; import java.util.Map; import java.util.ServiceConfigurationError; @@ -391,8 +391,8 @@ public boolean equals(Object right) { return false; } else { Token r = (Token) right; - return Arrays.equals(identifier, r.identifier) && - Arrays.equals(password, r.password) && + return MessageDigest.isEqual(identifier, r.identifier) && + MessageDigest.isEqual(password, r.password) && kind.equals(r.kind) && service.equals(r.service); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/security/token/block/BlockTokenSecretManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/security/token/block/BlockTokenSecretManager.java index 1d393783565..68b8e3c0575 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/security/token/block/BlockTokenSecretManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/security/token/block/BlockTokenSecretManager.java @@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.security.MessageDigest; import java.security.SecureRandom; import java.util.Arrays; import java.util.EnumSet; @@ -407,7 +408,7 @@ public void checkAccess(Token token, String userId, + ", block=" + block + ", access mode=" + mode); } checkAccess(id, userId, block, mode, storageTypes, storageIds); - if (!Arrays.equals(retrievePassword(id), token.getPassword())) { + if (!MessageDigest.isEqual(retrievePassword(id), token.getPassword())) { throw new InvalidToken("Block token with " + id + " doesn't have the correct token password"); } @@ -427,7 +428,7 @@ public void checkAccess(Token token, String userId, + ", block=" + block + ", access mode=" + mode); } checkAccess(id, userId, block, mode); - if (!Arrays.equals(retrievePassword(id), token.getPassword())) { + if (!MessageDigest.isEqual(retrievePassword(id), token.getPassword())) { throw new InvalidToken("Block token with " + id + " doesn't have the correct token password"); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java index ee1a5bf2852..ddfcdd82026 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java @@ -174,8 +174,8 @@ import java.net.InetSocketAddress; import java.net.URISyntaxException; import java.nio.ByteBuffer; +import java.security.MessageDigest; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -1231,7 +1231,7 @@ protected ContainerTokenIdentifier verifyAndGetContainerTokenIdentifier( containerTokenIdentifier); byte[] tokenPass = token.getPassword().array(); if (password == null || tokenPass == null - || !Arrays.equals(password, tokenPass)) { + || !MessageDigest.isEqual(password, tokenPass)) { throw new InvalidToken( "Invalid container token used for starting container on : " + context.getNodeId().toString());