提交 1701ac95 编写于 作者: J Jesse Glick

Merge branch 'security-stable-1.625' into security-stable-1.642

...@@ -78,7 +78,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { ...@@ -78,7 +78,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
final String commandName = req.getRestOfPath().substring(1); final String commandName = req.getRestOfPath().substring(1);
CLICommand command = CLICommand.clone(commandName); CLICommand command = CLICommand.clone(commandName);
if (command == null) { if (command == null) {
rsp.sendError(HttpServletResponse.SC_NOT_FOUND, "No such command " + commandName); rsp.sendError(HttpServletResponse.SC_NOT_FOUND, "No such command");
return; return;
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
package hudson.security.csrf; package hudson.security.csrf;
import java.nio.charset.Charset;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.logging.Level; import java.util.logging.Level;
...@@ -95,7 +96,9 @@ public class DefaultCrumbIssuer extends CrumbIssuer { ...@@ -95,7 +96,9 @@ public class DefaultCrumbIssuer extends CrumbIssuer {
if (request instanceof HttpServletRequest) { if (request instanceof HttpServletRequest) {
String newCrumb = issueCrumb(request, salt); String newCrumb = issueCrumb(request, salt);
if ((newCrumb != null) && (crumb != null)) { if ((newCrumb != null) && (crumb != null)) {
return newCrumb.equals(crumb); // String.equals() is not constant-time, but this is
return MessageDigest.isEqual(newCrumb.getBytes(Charset.forName("US-ASCII")),
crumb.getBytes(Charset.forName("US-ASCII")));
} }
} }
return false; return false;
......
...@@ -41,6 +41,8 @@ import org.kohsuke.stapler.StaplerRequest; ...@@ -41,6 +41,8 @@ import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.SecureRandom; import java.security.SecureRandom;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -109,7 +111,10 @@ public class ApiTokenProperty extends UserProperty { ...@@ -109,7 +111,10 @@ public class ApiTokenProperty extends UserProperty {
} }
public boolean matchesPassword(String password) { public boolean matchesPassword(String password) {
return getApiTokenInsecure().equals(password); String token = getApiTokenInsecure();
// String.equals isn't constant time, but this is
return MessageDigest.isEqual(password.getBytes(Charset.forName("US-ASCII")),
token.getBytes(Charset.forName("US-ASCII")));
} }
private boolean hasPermissionToSeeToken() { private boolean hasPermissionToSeeToken() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册