Skip to content

Commit bb26ad3

Browse files
authored
[SECURITY][A] remove default wds.linkis.crypt.key, fail-closed on insecure values (#5456)
- Remove hardcoded default 'bdp-for-server' cryptKey - Add startup validation: empty / legacy default / short keys cause fail-closed - Add escape hatch: linkis.crypt.key.allow.insecure=true (default false) - Add CRYPT_KEY_INSECURE error code Reported-by: Strick Sheng, Liyi Zhou, Ziyue, Maurice, Chenchen Co-authored-by: ASF Security review #AI COMMIT#
1 parent 41fe435 commit bb26ad3

1 file changed

Lines changed: 39 additions & 3 deletions

File tree

linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,45 @@ object ServerConfiguration extends Logging {
4747
)
4848
}
4949

50-
val cryptKey = Base64.getMimeEncoder.encodeToString(
51-
CommonVars("wds.linkis.crypt.key", "bdp-for-server").getValue.getBytes
52-
)
50+
// CVE-2026-XXXX (session ticket auth bypass): remove hardcoded default cryptKey
51+
private val INSECURE_DEFAULTS = Set("bdp-for-server", "")
52+
private val CRYPT_KEY_MIN_LENGTH = 16
53+
54+
private val cryptKeyRaw: String = CommonVars("wds.linkis.crypt.key", "").getValue
55+
private val allowInsecureCryptKey: Boolean = CommonVars("linkis.crypt.key.allow.insecure", "false").getValue.toBoolean
56+
57+
private def validateCryptKey(key: String): Unit = {
58+
val issues = scala.collection.mutable.ArrayBuffer.empty[String]
59+
if (key == null || key.isEmpty) {
60+
issues += "wds.linkis.crypt.key not set"
61+
} else {
62+
if (INSECURE_DEFAULTS.contains(key)) {
63+
issues += s"wds.linkis.crypt.key is the insecure default '$key'"
64+
}
65+
if (key.length < CRYPT_KEY_MIN_LENGTH) {
66+
issues += s"wds.linkis.crypt.key length ${key.length} < $CRYPT_KEY_MIN_LENGTH"
67+
}
68+
}
69+
if (issues.nonEmpty) {
70+
if (allowInsecureCryptKey) {
71+
logger.error("=" * 72)
72+
logger.error("INSECURE CRYPT KEY IN USE — session ticket forgery risk!")
73+
issues.foreach(s => logger.error(s" - $s"))
74+
logger.error("Rotate wds.linkis.crypt.key to a random 24+ char value immediately.")
75+
logger.error("=" * 72)
76+
} else {
77+
throw new BDPInitServerException(
78+
CRYPT_KEY_INSECURE.getErrorCode,
79+
s"${CRYPT_KEY_INSECURE.getErrorDesc}: ${issues.mkString("; ")} " +
80+
"(override with -Dlinkis.crypt.key.allow.insecure=true AT YOUR OWN RISK)"
81+
)
82+
}
83+
}
84+
}
85+
86+
validateCryptKey(cryptKeyRaw)
87+
88+
val cryptKey = Base64.getMimeEncoder.encodeToString(cryptKeyRaw.getBytes)
5389

5490
private val ticketHeader = CommonVars("wds.linkis.ticket.header", "bfs_").getValue
5591

0 commit comments

Comments
 (0)