aws / aws/aws-encryption-sdk-javascript

Hierarchical Keyring: cold-cache stampede — N concurrent decrypts → N DynamoDB/KMS calls

未關閉
#1,663 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
TypeScript
星號
260
分支
68
平均合併
22 小時 19 分鐘
30 天內合併 PR
2

描述

### Security issue notifications

If you discover a potential security issue in the AWS Encryption SDK we ask that you notify AWS Security via our [vulnerability reporting page](https://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public GitHub issue.

### Problem:

The Node Hierarchical Keyring doesn't de-dupe concurrent branch-key lookups. If I fire a lot of decrypts for the same branch key at once against a cold cache, they all miss the cache together (it's only filled after the keystore call returns), so each one hits the keystore on its own.

So instead of one lookup I get N DynamoDB `GetItem` + N KMS `Decrypt` calls. Easy to repro: `await Promise.all` of ~3000 decrypts for the same key version, and you see ~3000 keystore calls instead of 1. Encrypt has the same problem since it shares the same code path.

### Solution:

Add single-flight to `getBranchKeyMaterials`: on a miss, the first caller starts the keystore fetch and stores the in-flight promise (keyed by cache entry id); everyone else for the same key awaits that promise instead of starting their own. The entry is dropped once it settles, so the materials cache still owns caching and TTL, and a failed request isn't shared — the next call just retries.

### Out of scope:

The legacy caching CMM has the same gap but it's a separate path, so I'm not touching it here.

[//]: # (NOTE: If you believe this might be a security issue, please email aws-security@amazon.com instead of creating a GitHub issue. For more details, see the AWS Vulnerability Reporting Guide: https://aws.amazon.com/security/vulnerability-reporting/ )

貢獻指南

開啟貢獻指南

研究方向

Start at the Node Hierarchical Keyring's getBranchKeyMaterials path and trace how the materials cache handles a cold-cache lookup. Reproduce the issue with concurrent decrypts or encrypts for one branch-key version and verify that one in-flight keystore request is shared, settled entries are removed, and a failed request can be retried.

由索引模型根據 Issue 內容生成。

評估

技術堆疊
aws, node.js, typescript
領域
backend, security
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
冷清
描述清晰度
描述清楚
新手友好度
52/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。