diff options
author | Tatu Lund <tatu@vaadin.com> | 2021-02-04 14:23:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-04 14:23:19 +0200 |
commit | a26eb8d4c63816eae9579c661712e47fa6fa0e18 (patch) | |
tree | 83839d555291e5f5124fcb0df3d9cf537f0c4be3 /server/src | |
parent | d0d2cfbda0f96b68293ce723bf776332d4ecd4de (diff) | |
download | vaadin-framework-a26eb8d4c63816eae9579c661712e47fa6fa0e18.tar.gz vaadin-framework-a26eb8d4c63816eae9579c661712e47fa6fa0e18.zip |
fix: use time-constant comparison for CSRF tokens (#12190)
This hardens the framework against a theoretical timing attack based on
comparing how quickly a request with an invalid CSRF token is rejected.
Backporting of #12188
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main/java/com/vaadin/server/VaadinService.java | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/server/src/main/java/com/vaadin/server/VaadinService.java b/server/src/main/java/com/vaadin/server/VaadinService.java index ada9a8b875..ff1a7663d5 100644 --- a/server/src/main/java/com/vaadin/server/VaadinService.java +++ b/server/src/main/java/com/vaadin/server/VaadinService.java @@ -24,10 +24,12 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Serializable; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; +import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -1761,7 +1763,15 @@ public abstract class VaadinService implements Serializable { .isXsrfProtectionEnabled()) { String sessionToken = session.getCsrfToken(); - if (sessionToken == null || !sessionToken.equals(requestToken)) { + try { + if (sessionToken == null || !MessageDigest.isEqual( + sessionToken.getBytes("UTF-8"), + requestToken.getBytes("UTF-8"))) { + return false; + } + } catch (UnsupportedEncodingException e) { + getLogger().log(Level.WARNING, + "Session token was not UTF-8, this should never happen."); return false; } } |