Skip to main content

Security Mitigations — Summary

Every vulnerability identified in the vulnerable codebase has been fixed in the secured version. This page provides a consolidated reference.


Vulnerability-to-Fix Mapping

#VulnerabilityCWEOWASPAttack ClassFix
1Unsafe DeserializationCWE-502A08:2021Attacker1_DeserializationObjectInputFilter whitelist + SerializationValidator
2Remote Class InjectionCWE-470A08:2021Attacker2_RemoteCodebaseuseCodebaseOnly=true
3Plaintext TransportCWE-319A02:2021Attacker3_EavesdropMutual TLS on every RMI connection
4Missing AuthenticationCWE-306A07:2021Attacker4_UnauthorizedAccessrequireAuth(token) on every operation
5Replay AttackCWE-294A08:2021Attacker5_ReplayAttackNonce + timestamp validation per write

Defense-in-Depth Stack

An attacker must pass all five layers. If any one fails, the request is rejected.

Side-by-Side: Vulnerable vs Secured

Vulnerability 1 — Deserialization

VulnerableSecured
Codesuper(0) — plain UnicastRemoteObjectsuper(0, csf, ssf) — mTLS sockets
FilterNo ObjectInputFilterjdk.serialFilter + SerializationValidator
ResultAttacker sends EvilPayload → RCEAttacker's bytes rejected before readObject()

Vulnerability 2 — Remote Codebase

VulnerableSecured
PropertyuseCodebaseOnly=falseuseCodebaseOnly=true
ResultServer downloads malicious class from attacker's HTTP serverRemote codebase URLs ignored

Vulnerability 3 — Encryption

VulnerableSecured
TransportPlain TCPMutual TLS
CredentialsSent in cleartextEncrypted
Client authNoneClient must present valid certificate
Resulttcpdump reveals passwordstcpdump shows only ciphertext

Vulnerability 4 — Authentication

VulnerableSecured
TokenParameter present but NEVER checkedrequireAuth(token) called first in every method
PasswordsStored as plaintextPBKDF2WithHmacSHA256, 260k iterations, per-user salt
ComparisonString.equals() (timing leak)MessageDigest.isEqual() (constant-time)
ResultAny client can do anythingInvalid token → UNAUTHORIZED

Vulnerability 5 — Replay

VulnerableSecured
NonceNot presentUUID.randomUUID() per operation
TimestampNot presentSystem.currentTimeMillis() per operation
ValidationNoneNonce uniqueness + timestamp freshness (5-min window)
ResultReplay silently corrupts dataReplay → REPLAY_REJECTED

Code Location Reference

WhatSecure VersionVulnerable Version
Serialization filterutil/SerializationValidator.java(not present)
mTLS configutil/TLSConfig.java, ReplicaNode.java:constructor(not present)
Auth checkReplicaNode.java:requireAuth()(isValidToken exists but unused)
Password hashingauth/PasswordUtils.java(plaintext in UserStore)
Nonce storeutil/NonceStore.java(not present)
useCodebaseOnlyReplicaNode.java:main()ReplicaNode.java:main() (set to false)

Academic References

Each fix maps to established security standards:

  1. ObjectInputFilter: Oracle JDK documentation — "Java Serialization Filtering"
  2. useCodebaseOnly: Oracle RMI documentation — "RMI over SSL"
  3. Mutual TLS: IETF RFC 8446 — "TLS 1.3"
  4. PBKDF2: IETF RFC 8018 — "PKCS #5: Password-Based Cryptography"
  5. Nonce + Timestamp: OWASP — "Replay Attack Prevention Cheat Sheet"

Next: → Setup & Build