[CVE-2018-1000180, CVE-2018-1000613] Upgrade Bouncycastle to 1.60
This upgrade fixes CVE-2018-1000180 [1]: Bouncy Castle BC 1.54 - 1.59, BC-FJA 1.0.0, BC-FJA 1.0.1 and earlier have a flaw in the Low-level interface to RSA key pair generator, specifically RSA Key Pairs generated in low-level API with added certainty may have less M-R tests than expected. This appears to be fixed in versions BC 1.60 beta 4 and later, BC-FJA 1.0.2 and later. and CVE-2018-1000613 [2]: Bouncy Castle Java Cryptography APIs version prior to version 1.60 contains a CWE-470: Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection') vulnerability in XMSS/XMSS^MT private key deserialization that can result in Deserializing an XMSS/XMSS^MT private key can result in the execution of unexpected code. This attack appear to be exploitable via a handcrafted private key can include references to unexpected classes which will be picked up from the class path for the executing application. This vulnerability appears to have been fixed in 1.60 and later. Bouncycastle 1.57 introduced generics in its APIs. Remove the casts and @SuppressWarnings("unchecked") annotations that are not necessary any more. [1] https://nvd.nist.gov/vuln/detail/CVE-2018-1000180 [2] https://nvd.nist.gov/vuln/detail/CVE-2018-1000613 Bug: Issue 9952 Change-Id: I9b25b1568ac7da555de96d82c597b3dff47966c6
This commit is contained in:
@@ -585,24 +585,25 @@ maven_jar(
|
|||||||
sha1 = "bb562ee73f740bb6b2bf7955f97be6b870d9e9f0",
|
sha1 = "bb562ee73f740bb6b2bf7955f97be6b870d9e9f0",
|
||||||
)
|
)
|
||||||
|
|
||||||
BC_VERS = "1.56"
|
# When updating Bouncy Castle, also update it in bazlets.
|
||||||
|
BC_VERS = "1.60"
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcprov",
|
name = "bcprov",
|
||||||
artifact = "org.bouncycastle:bcprov-jdk15on:" + BC_VERS,
|
artifact = "org.bouncycastle:bcprov-jdk15on:" + BC_VERS,
|
||||||
sha1 = "a153c6f9744a3e9dd6feab5e210e1c9861362ec7",
|
sha1 = "bd47ad3bd14b8e82595c7adaa143501e60842a84",
|
||||||
)
|
)
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcpg",
|
name = "bcpg",
|
||||||
artifact = "org.bouncycastle:bcpg-jdk15on:" + BC_VERS,
|
artifact = "org.bouncycastle:bcpg-jdk15on:" + BC_VERS,
|
||||||
sha1 = "9c3f2e7072c8cc1152079b5c25291a9f462631f1",
|
sha1 = "13c7a199c484127daad298996e95818478431a2c",
|
||||||
)
|
)
|
||||||
|
|
||||||
maven_jar(
|
maven_jar(
|
||||||
name = "bcpkix",
|
name = "bcpkix",
|
||||||
artifact = "org.bouncycastle:bcpkix-jdk15on:" + BC_VERS,
|
artifact = "org.bouncycastle:bcpkix-jdk15on:" + BC_VERS,
|
||||||
sha1 = "4648af70268b6fdb24674fb1fd7c1fcc73db1231",
|
sha1 = "d0c46320fbc07be3a24eb13a56cee4e3d38e0c75",
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(davido): Remove exlusion of file system provider, when this issue is fixed:
|
# TODO(davido): Remove exlusion of file system provider, when this issue is fixed:
|
||||||
|
@@ -963,7 +963,6 @@ public class AccountIT extends AbstractDaemonTest {
|
|||||||
assertThat(actual.fingerprint)
|
assertThat(actual.fingerprint)
|
||||||
.named(id)
|
.named(id)
|
||||||
.isEqualTo(Fingerprint.toString(expected.getPublicKey().getFingerprint()));
|
.isEqualTo(Fingerprint.toString(expected.getPublicKey().getFingerprint()));
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<String> userIds = ImmutableList.copyOf(expected.getPublicKey().getUserIDs());
|
List<String> userIds = ImmutableList.copyOf(expected.getPublicKey().getUserIDs());
|
||||||
assertThat(actual.userIds).named(id).containsExactlyElementsIn(userIds);
|
assertThat(actual.userIds).named(id).containsExactlyElementsIn(userIds);
|
||||||
assertThat(actual.key).named(id).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n");
|
assertThat(actual.key).named(id).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n");
|
||||||
|
@@ -176,7 +176,6 @@ public class GerritPublicKeyChecker extends PublicKeyChecker {
|
|||||||
|
|
||||||
private boolean hasAllowedUserId(PGPPublicKey key, Set<String> allowedUserIds)
|
private boolean hasAllowedUserId(PGPPublicKey key, Set<String> allowedUserIds)
|
||||||
throws PGPException {
|
throws PGPException {
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<String> userIds = key.getUserIDs();
|
Iterator<String> userIds = key.getUserIDs();
|
||||||
while (userIds.hasNext()) {
|
while (userIds.hasNext()) {
|
||||||
String userId = userIds.next();
|
String userId = userIds.next();
|
||||||
|
@@ -381,7 +381,6 @@ public class PublicKeyChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<CheckResult> signerResults = new ArrayList<>();
|
List<CheckResult> signerResults = new ArrayList<>();
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<String> userIds = key.getUserIDs();
|
Iterator<String> userIds = key.getUserIDs();
|
||||||
while (userIds.hasNext()) {
|
while (userIds.hasNext()) {
|
||||||
String userId = userIds.next();
|
String userId = userIds.next();
|
||||||
|
@@ -398,7 +398,6 @@ public class PublicKeyStore implements AutoCloseable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String keyToString(PGPPublicKey key) {
|
public static String keyToString(PGPPublicKey key) {
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<String> it = key.getUserIDs();
|
Iterator<String> it = key.getUserIDs();
|
||||||
return String.format(
|
return String.format(
|
||||||
"%s %s(%s)",
|
"%s %s(%s)",
|
||||||
|
@@ -230,7 +230,6 @@ public class GpgKeys implements ChildCollection<AccountResource, GpgKey> {
|
|||||||
if (key != null) {
|
if (key != null) {
|
||||||
info.id = PublicKeyStore.keyIdToString(key.getKeyID());
|
info.id = PublicKeyStore.keyIdToString(key.getKeyID());
|
||||||
info.fingerprint = Fingerprint.toString(key.getFingerprint());
|
info.fingerprint = Fingerprint.toString(key.getFingerprint());
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<String> userIds = key.getUserIDs();
|
Iterator<String> userIds = key.getUserIDs();
|
||||||
info.userIds = ImmutableList.copyOf(userIds);
|
info.userIds = ImmutableList.copyOf(userIds);
|
||||||
|
|
||||||
|
@@ -373,7 +373,7 @@ public class GerritPublicKeyCheckerTest {
|
|||||||
|
|
||||||
PGPPublicKeyRing keyRingB = keyB().getPublicKeyRing();
|
PGPPublicKeyRing keyRingB = keyB().getPublicKeyRing();
|
||||||
PGPPublicKey keyB = keyRingB.getPublicKey();
|
PGPPublicKey keyB = keyRingB.getPublicKey();
|
||||||
keyB = PGPPublicKey.removeCertification(keyB, (String) keyB.getUserIDs().next());
|
keyB = PGPPublicKey.removeCertification(keyB, keyB.getUserIDs().next());
|
||||||
keyRingB = PGPPublicKeyRing.insertPublicKey(keyRingB, keyB);
|
keyRingB = PGPPublicKeyRing.insertPublicKey(keyRingB, keyB);
|
||||||
add(keyRingB, addUser("userB"));
|
add(keyRingB, addUser("userB"));
|
||||||
|
|
||||||
@@ -391,8 +391,7 @@ public class GerritPublicKeyCheckerTest {
|
|||||||
List<ExternalId> newExtIds = new ArrayList<>(2);
|
List<ExternalId> newExtIds = new ArrayList<>(2);
|
||||||
newExtIds.add(ExternalId.create(toExtIdKey(kr.getPublicKey()), id));
|
newExtIds.add(ExternalId.create(toExtIdKey(kr.getPublicKey()), id));
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
String userId = Iterators.getOnlyElement(kr.getPublicKey().getUserIDs(), null);
|
||||||
String userId = (String) Iterators.getOnlyElement(kr.getPublicKey().getUserIDs(), null);
|
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
String email = PushCertificateIdent.parse(userId).getEmailAddress();
|
String email = PushCertificateIdent.parse(userId).getEmailAddress();
|
||||||
assertThat(email).contains("@");
|
assertThat(email).contains("@");
|
||||||
|
@@ -236,7 +236,6 @@ public class PublicKeyStoreTest {
|
|||||||
|
|
||||||
private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) throws Exception {
|
private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) throws Exception {
|
||||||
List<String> actual = new ArrayList<>();
|
List<String> actual = new ArrayList<>();
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<String> userIds =
|
Iterator<String> userIds =
|
||||||
store.get(keyRing.getPublicKey().getKeyID()).iterator().next().getPublicKey().getUserIDs();
|
store.get(keyRing.getPublicKey().getKeyID()).iterator().next().getPublicKey().getUserIDs();
|
||||||
while (userIds.hasNext()) {
|
while (userIds.hasNext()) {
|
||||||
|
@@ -77,7 +77,7 @@ public class TestKey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getFirstUserId() {
|
public String getFirstUserId() {
|
||||||
return (String) getPublicKey().getUserIDs().next();
|
return getPublicKey().getUserIDs().next();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PGPPrivateKey getPrivateKey() throws PGPException {
|
public PGPPrivateKey getPrivateKey() throws PGPException {
|
||||||
|
Reference in New Issue
Block a user