Security: Prevent keystream reuse when cloning or resuming stateful cipher workers
维护者通常 1 天内回复
@officialfrancismendoza 已经在做这个了。
开始于 2026年10月21日。
评估
这个 Issue 还没有评估数据。
描述
Summary
The new key-management architecture introduced in #172 raises a security concern around cloning and suspending stateful cipher workers.
Some cipher workers, including stream ciphers and AEAD implementations, can be cloned while an encryption/decryption operation is in progress. Cloning a worker may duplicate its internal state, including the current nonce, counter, and keystream position.
If both copies are subsequently used for encryption under the same key, they may generate identical keystream bytes.
This is especially dangerous for stream ciphers such as ChaCha20 and AES-CTR, where keystream reuse can compromise message confidentiality.
Related PRs:
- #172 — Key-management architecture
- #157 — ChaCha20, Poly1305, and ChaCha20-Poly1305 AEAD
Security implications
For a stream cipher:
C = P XOR K
Where:
C = Ciphertext
P = Plaintext
K = Generated keystream
If two workers are cloned at the same state and subsequently encrypt different plaintexts using the same keystream:
C1 XOR C2 = P1 XOR P2
The keystream cancels, potentially revealing information about both plaintexts.
For AEAD implementations, reusing the same key/nonce combination may additionally undermine authentication guarantees.
The concern extends to Suspendable and SuspendableKeyed interfaces if saved state can be restored multiple times, allowing multiple workers to continue from the same cryptographic state.
Note: This is a potential API misuse vulnerability, not a claim that the current implementation automatically reuses nonces or keystreams.
Affected interfaces
The following should be reviewed:
Cloneimplementations on stateful encryption/decryption workers.SuspendableandSuspendableKeyedimplementations.- Resume operations that accept previously serialized cryptographic state.
- AEAD workers whose internal state includes nonce/counter or authentication state.
- APIs that allow multiple workers to be initialized from the same key/nonce combination.
In #157, implementing SuspendableKeyed for ChaCha20-Poly1305 was explicitly deferred because of these concerns.
Potential solutions
Option 1: Remove Clone from stateful cipher workers
Prevent workers from being duplicated while they hold an active cryptographic state.
Advantages:
- Compile-time prevention of accidental worker cloning.
- Simple security model.
- Consistent with Rust's ownership principles.
Disadvantages:
- Breaking API change.
- May affect legitimate use cases involving cloned state.
Recommendation: Strong default for encryption workers.
Option 2: Restrict or redesign SuspendableKeyed
Treat suspended encryption state as a one-time continuation capability.
Possible approaches include:
- Consuming the state when resuming.
- Avoiding
Cloneon in-memory suspended-state objects. - Requiring explicit unsafe or hazardous APIs for state duplication.
- Introducing state-reuse tracking where appropriate.
Important limitation: Consuming an in-memory state does not prevent a caller from copying serialized checkpoint bytes before resuming.
Preventing replay across serialized copies requires additional mechanisms, such as persistent state tracking or monotonic counters, and cannot be guaranteed through Rust ownership alone.
Advantages:
- Reduces accidental state reuse.
- Makes security expectations explicit.
Disadvantages:
- Potentially breaking API changes.
- Persistent replay prevention introduces additional complexity.
Option 3: Separate encryption and decryption capabilities
Apply stricter rules to encryption workers than to decryption workers.
For example:
- Encryption workers are non-cloneable.
- Decryption workers may support cloning or replay when appropriate.
- Encryption resume operations require additional safeguards.
Advantages:
- Preserves useful decryption functionality.
- Targets restrictions at the highest-risk operations.
Disadvantages:
- More complex trait bounds and APIs.
- Does not eliminate misuse through copied serialized state.
Option 4: Document the risks and retain the existing API
Keep the current interfaces but document that cloning or restoring an encryption state can result in keystream reuse.
Advantages:
- Minimal implementation effort.
- No breaking changes.
Disadvantages:
- Relies entirely on callers following security guidance.
- Does not prevent accidental misuse.
Recommendation: Useful as defense-in-depth, but insufficient as the only mitigation for a misuse-resistant cryptographic API.
Proposed direction
I recommend:
- Remove
Clonefrom active encryption workers by default, unless an algorithm-specific security justification exists. - Review whether
SuspendableKeyedshould be implemented for stateful encryption workers at all. - If encryption-state restoration is supported, explicitly define its replay and state-ownership semantics.
- Distinguish encryption from decryption where different restrictions are appropriate.
- Add compile-fail tests verifying that restricted worker types cannot be cloned.
- Add regression tests covering suspension/resumption and the handling of duplicated checkpoints.
Questions for maintainers
- Should
Clonebe permitted on active encryption workers? - Is
SuspendableKeyedintended to support resumable encryption, or primarily state persistence for other purposes? - Should the library guarantee misuse resistance against duplicated state, or explicitly place that responsibility on callers?
- Should encryption and decryption workers have different cloning and suspension capabilities?
The goal is to establish consistent security semantics across the cipher APIs before adding SuspendableKeyed support to ChaCha20-Poly1305 and other stateful AEAD implementations.
- 主要语言
- Rust
- 星标
- 25
- 派生
- 18
- 平均合并
- 56 分钟
- 30 天内合并 PR
- 1
环境准备
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
bcgit/bc-rust 的其他 Issue
-
Improve docs in Factories可能已有人在做 @pollychen-lab 于 22 天前认领。 未关闭documentation good first issue help wanted
难度 2/5 1-3 小时 新手友好度 82/100
bcgit/bc-rust#161 · 1 个 reaction ·
维护者通常 1 天内回复
-
good first issue refactor
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 45/100
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 45/100
维护者通常 1 天内回复
-
Framework for asm可能已有人在做 @mwcw 于 10 天前认领。 未关闭
难度 5/5 一周以上 新手友好度 12/100
bcgit/bc-rust#168 · 4 条评论 · 已指派 1 人 ·
维护者通常 1 天内回复
相似的 Issue
-
state:triage-needed
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 1 天内回复
-
bug P2
难度 2/5 1-3 小时 新手友好度 74/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 74/100
维护者通常 1 天内回复
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32可能已有人在做 @BartWaardenburg 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 64/100
servo/rust-cssparser#460 ·
-
`-w -r <range>` fails empty range but changed working tree可能已有人在做 @dajiaohuang 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 2 天内回复