v1.1.7: deep security & reliability audit — 33 bugs fixed
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
Critical (5): - Reject empty JWT secret when authEnabled (server.nim) - Fix 2PC marking uncontacted participants as prepared/committed (disttxn.nim) - Fix Raft commit index calculation for even-sized clusters (raft.nim) - Fix REP/DISTTXN protocol auth bypass (server.nim) - Fix HTTP backup/restore path traversal (httpserver.nim) High (11): - Fix WAL write race with flush (lsm.nim) - Fix MVCC savepoint/rollback deep-copy writeSet (mvcc.nim) - Fix table mutation during deadlock iteration (mvcc.nim) - Fix LIMIT 0 returning all rows (executor.nim) - Fix COUNT(col) counting NULL values — 3 locations (executor.nim) - Fix EXISTS subquery lowering missing subqueryPlan (executor.nim) - Fix Raft appendEntries/applyCommitted array vs logical index (raft.nim) - Fix timing attacks on constantTimeCompare and SCRAM (auth.nim, scram.nim) - Fix B-tree leaf merge phantom separator key (btree.nim) - Fix SSL verifyPeer not applied to newContext (ssl.nim) - Fix sharding connectWithTimeout missing SO_ERROR check (sharding.nim) - Fix sync replication returning success on partial ack (replication.nim) - Fix WebSocket JWT expiration not validated (websocket.nim) Medium (13): - Fix writeSSTable partial file → tmp + atomic rename (lsm.nim) - Fix multi-CTE table loss (executor.nim) - Fix nl_to_sql DML restricted to superuser (executor.nim) - Fix unbounded plan cache — max 10000 (adaptive.nim) - Fix migration lock crash persistence — timestamp + stale detection (executor.nim) - Fix admin panel auth (httpserver.nim) - Fix MVCC unbounded txn tracking — prune in compactVersions (mvcc.nim) - Fix connection pool maxLifetime check (pool.nim) - Fix JWT JSON parser backslash escapes (auth.nim) - Fix substr(s, start) returning single char (udf.nim) - Fix loadSSTable minimum file-size check (lsm.nim) - Fix compaction mmap leak (compaction.nim) - Fix JSON injection in hybrid_search_filtered (executor.nim) Low (4): - Raft loadState logs error instead of silent discard - Replication healthCheck double-close fixed - Lexer readIdent double column counting fixed - WebSocket frame 32-bit overflow guard All 448 tests passing, 0 failures. Bump version to 1.1.7.
This commit is contained in:
@@ -100,11 +100,12 @@ proc hmacSha256(key, message: string): string =
|
||||
return $outerHash
|
||||
|
||||
proc constantTimeCompare(a, b: string): bool =
|
||||
if a.len != b.len:
|
||||
return false
|
||||
var diff = 0
|
||||
for i in 0..<a.len:
|
||||
diff = diff or (ord(a[i]) xor ord(b[i]))
|
||||
let n = max(a.len, b.len)
|
||||
var diff = a.len xor b.len
|
||||
for i in 0..<n:
|
||||
let ca = if i < a.len: ord(a[i]) else: 0
|
||||
let cb = if i < b.len: ord(b[i]) else: 0
|
||||
diff = diff or (ca xor cb)
|
||||
return diff == 0
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -159,8 +160,18 @@ proc verifyToken*(am: AuthManager, token: string): (bool, JWTClaims) =
|
||||
if i < payload.len and payload[i] == '"':
|
||||
inc i
|
||||
while i < payload.len and payload[i] != '"':
|
||||
val &= payload[i]
|
||||
inc i
|
||||
if payload[i] == '\\' and i + 1 < payload.len:
|
||||
case payload[i+1]
|
||||
of '"': val &= '"'
|
||||
of '\\': val &= '\\'
|
||||
of '/': val &= '/'
|
||||
of 'n': val &= '\n'
|
||||
of 't': val &= '\t'
|
||||
else: val &= payload[i+1]
|
||||
inc i; inc i
|
||||
else:
|
||||
val &= payload[i]
|
||||
inc i
|
||||
inc i
|
||||
elif i < payload.len and payload[i] in {'0'..'9', '-'}:
|
||||
while i < payload.len and payload[i] notin {',', '}'}:
|
||||
|
||||
Reference in New Issue
Block a user