This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 70017f9 Destroy more keys after use
70017f9 is described below
commit 70017f9262dd555e1daaf71a721e92020b3df98c
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Thu Dec 20 11:46:14 2018 +0000
Destroy more keys after use
---
.../utils/crypto/ModelEncryptionSupport.java | 45 ++++++++++++++++++++--
.../cxf/rs/security/saml/sso/MetadataService.java | 12 +++++-
.../saml/sso/SAMLProtocolResponseValidator.java | 4 ++
.../security/saml/sso/SamlPostBindingFilter.java | 8 ++++
.../saml/sso/SamlRedirectBindingFilter.java | 8 ++++
.../rs/security/xml/AbstractXmlEncInHandler.java | 4 ++
.../cxf/rs/security/xml/XmlSigOutInterceptor.java | 9 +++++
7 files changed, 85 insertions(+), 5 deletions(-)
diff --git
a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/crypto/ModelEncryptionSupport.java
b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/crypto/ModelEncryptionSupport.java
index 25c7365..f7d5493 100644
---
a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/crypto/ModelEncryptionSupport.java
+++
b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/utils/crypto/ModelEncryptionSupport.java
@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map;
import javax.crypto.SecretKey;
+import javax.security.auth.DestroyFailedException;
import org.apache.cxf.rs.security.oauth2.common.Client;
import org.apache.cxf.rs.security.oauth2.common.OAuthPermission;
@@ -99,7 +100,16 @@ public final class ModelEncryptionSupport {
public static Client decryptClient(String encodedSequence, String
encodedSecretKey,
KeyProperties props) throws
SecurityException {
SecretKey key = CryptoUtils.decodeSecretKey(encodedSecretKey,
props.getKeyAlgo());
- return decryptClient(encodedSequence, key, props);
+ Client client = decryptClient(encodedSequence, key, props);
+
+ // Clean the secret key from memory when we're done
+ try {
+ key.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
+ return client;
}
public static Client decryptClient(String encodedSequence, Key secretKey)
throws SecurityException {
@@ -123,7 +133,16 @@ public final class ModelEncryptionSupport {
String encodedSecretKey,
KeyProperties props) throws
SecurityException {
SecretKey key = CryptoUtils.decodeSecretKey(encodedSecretKey,
props.getKeyAlgo());
- return decryptAccessToken(provider, encodedToken, key, props);
+ ServerAccessToken serverAccessToken = decryptAccessToken(provider,
encodedToken, key, props);
+
+ // Clean the secret key from memory when we're done
+ try {
+ key.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
+ return serverAccessToken;
}
public static ServerAccessToken decryptAccessToken(OAuthDataProvider
provider,
@@ -151,7 +170,16 @@ public final class ModelEncryptionSupport {
String encodedSecretKey,
KeyProperties props) throws
SecurityException {
SecretKey key = CryptoUtils.decodeSecretKey(encodedSecretKey,
props.getKeyAlgo());
- return decryptRefreshToken(provider, encodedToken, key, props);
+ RefreshToken refreshToken = decryptRefreshToken(provider,
encodedToken, key, props);
+
+ // Clean the secret key from memory when we're done
+ try {
+ key.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
+ return refreshToken;
}
public static RefreshToken decryptRefreshToken(OAuthDataProvider provider,
@@ -179,7 +207,16 @@ public final class ModelEncryptionSupport {
String encodedSecretKey,
KeyProperties props) throws
SecurityException {
SecretKey key = CryptoUtils.decodeSecretKey(encodedSecretKey,
props.getKeyAlgo());
- return decryptCodeGrant(provider, encodedToken, key, props);
+ ServerAuthorizationCodeGrant authzCodeGrant =
decryptCodeGrant(provider, encodedToken, key, props);
+
+ // Clean the secret key from memory when we're done
+ try {
+ key.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
+ return authzCodeGrant;
}
public static ServerAuthorizationCodeGrant
decryptCodeGrant(OAuthDataProvider provider,
diff --git
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/MetadataService.java
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/MetadataService.java
index 020394c..e2cc109 100644
---
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/MetadataService.java
+++
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/MetadataService.java
@@ -24,6 +24,7 @@ import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.security.auth.DestroyFailedException;
import javax.security.auth.callback.CallbackHandler;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -98,10 +99,19 @@ public class MetadataService extends AbstractSSOSpHandler {
privateKey, issuerCerts[0],
true);
}
- return metadataWriter.getMetaData(serviceAddress,
assertionConsumerServiceAddress,
+ Document metadata = metadataWriter.getMetaData(serviceAddress,
assertionConsumerServiceAddress,
logoutServiceAddress,
privateKey, issuerCerts[0],
true);
+
+ // Clean the private key from memory when we're done
+ try {
+ privateKey.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
+ return metadata;
} catch (Exception ex) {
LOG.log(Level.FINE, ex.getMessage(), ex);
throw ExceptionUtils.toInternalServerErrorException(ex, null);
diff --git
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SAMLProtocolResponseValidator.java
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SAMLProtocolResponseValidator.java
index a671317..89fe44e 100644
---
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SAMLProtocolResponseValidator.java
+++
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SAMLProtocolResponseValidator.java
@@ -23,6 +23,7 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
+import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -499,6 +500,9 @@ public class SAMLProtocolResponseValidator {
throw new
WSSecurityException(WSSecurityException.ErrorCode.FAILURE,
"invalidSAMLsecurity");
}
+ // Clean the symmetric key from memory now that we're done with it
+ Arrays.fill(decryptedBytes, (byte) 0);
+
Document payloadDoc = null;
try {
payloadDoc = StaxUtils.read(new InputStreamReader(new
ByteArrayInputStream(decryptedPayload),
diff --git
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlPostBindingFilter.java
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlPostBindingFilter.java
index 3b5355f..51eb00a 100644
---
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlPostBindingFilter.java
+++
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlPostBindingFilter.java
@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
+import javax.security.auth.DestroyFailedException;
import javax.security.auth.callback.CallbackHandler;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.HttpHeaders;
@@ -172,6 +173,13 @@ public class SamlPostBindingFilter extends
AbstractServiceProviderFilter {
signableObject.releaseDOM();
signableObject.releaseChildrenDOM(true);
+ // Clean the private key from memory when we're done
+ try {
+ privateKey.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
}
}
diff --git
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlRedirectBindingFilter.java
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlRedirectBindingFilter.java
index e1cb5d5..8767f92 100644
---
a/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlRedirectBindingFilter.java
+++
b/rt/rs/security/sso/saml/src/main/java/org/apache/cxf/rs/security/saml/sso/SamlRedirectBindingFilter.java
@@ -27,6 +27,7 @@ import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.logging.Level;
+import javax.security.auth.DestroyFailedException;
import javax.security.auth.callback.CallbackHandler;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.HttpHeaders;
@@ -163,6 +164,13 @@ public class SamlRedirectBindingFilter extends
AbstractServiceProviderFilter {
String encodedSignature =
Base64.getEncoder().encodeToString(signBytes);
+ // Clean the private key from memory when we're done
+ try {
+ privateKey.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
ub.queryParam(SSOConstants.SIGNATURE,
URLEncoder.encode(encodedSignature, StandardCharsets.UTF_8.name()));
}
diff --git
a/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/AbstractXmlEncInHandler.java
b/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/AbstractXmlEncInHandler.java
index 5c02eaf..e9ca746 100644
---
a/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/AbstractXmlEncInHandler.java
+++
b/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/AbstractXmlEncInHandler.java
@@ -25,6 +25,7 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
+import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
@@ -81,6 +82,9 @@ public abstract class AbstractXmlEncInHandler extends
AbstractXmlSecInHandler {
throwFault("Payload can not be decrypted", ex);
}
+ // Clean the secret key from memory
+ Arrays.fill(symmetricKeyBytes, (byte) 0);
+
Document payloadDoc = null;
try {
payloadDoc = StaxUtils.read(new InputStreamReader(new
ByteArrayInputStream(decryptedPayload),
diff --git
a/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/XmlSigOutInterceptor.java
b/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/XmlSigOutInterceptor.java
index 08c75f8..010c2a1 100644
---
a/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/XmlSigOutInterceptor.java
+++
b/rt/rs/security/xml/src/main/java/org/apache/cxf/rs/security/xml/XmlSigOutInterceptor.java
@@ -26,6 +26,7 @@ import java.util.Set;
import java.util.UUID;
import java.util.logging.Logger;
+import javax.security.auth.DestroyFailedException;
import javax.xml.namespace.QName;
import org.w3c.dom.Document;
@@ -157,6 +158,14 @@ public class XmlSigOutInterceptor extends
AbstractXmlSecOutInterceptor {
sig.addKeyInfo(issuerCerts[0].getPublicKey());
}
sig.sign(privateKey);
+
+ // Clean the private key from memory when we're done
+ try {
+ privateKey.destroy();
+ } catch (DestroyFailedException ex) {
+ // ignore
+ }
+
return sig.getElement().getOwnerDocument();
}