# Threat Model - Yjs This document outlines the threat model for the Yjs project, a CRDT framework for shared editing. It identifies assets, threat actors, attack surfaces, and mitigations. ## 1. Assets What we are protecting: | Asset | Description | |-------|-------------| | Document data | Shared documents edited by end users via Yjs-powered applications | | Library integrity | The correctness and safety of the Yjs source code and published npm packages | | CI/CD pipeline | GitHub Actions workflows, publishing credentials, and automation | | Maintainer accounts | GitHub and npm accounts of project maintainers | | User trust | Reputation and reliability of the project as a dependency | ## 2. Threat Actors | Actor | Motivation | Capability | |-------|-----------|------------| | Malicious contributor | Inject backdoor or vulnerable code via pull requests | Low-Medium: constrained by code review | | Supply chain attacker | Compromise a dependency to reach Yjs consumers downstream | Medium: targets transitive dependencies | | Malicious peer (network) | Exploit the CRDT sync protocol to corrupt documents or crash peers | Medium: can craft arbitrary binary messages | | Compromised maintainer account | Publish a malicious package version to npm | High: full publish access | | Automated bots | Spam, typosquatting, or social engineering via issues/PRs | Low | ## 3. Attack Surfaces ### 3.1 Document Corruption by Write-Peers Any peer with write access has the theoretical ability to corrupt a Yjs document. The CRDT protocol is designed for collaboration between trusted peers — it guarantees conflict-free merging, but it does not protect against a malicious peer intentionally writing destructive operations. Once a malicious update is applied to a document, it becomes part of the document's permanent history. **It is therefore critical that untrusted peers are never allowed to write updates to the original Yjs document.** **Server-side filtering of updates is a common antipattern.** Some applications attempt to validate or filter incoming updates on the server before applying them to the shared document. This approach is fundamentally flawed with untrusted peers — Yjs updates are binary-encoded CRDT operations, and selectively filtering them can easily be exploited and is not a reliable security boundary. **Suggestion-only (untrusted) users should work on a separate Yjs document fork**, not on the original document. Their changes can be reviewed and selectively merged by a trusted peer. Only trusted, authenticated peers should be allowed to write to the authoritative document. Additionally, a malicious peer could send crafted binary messages to: - **Cause denial of service** via extremely large updates, deeply nested structures, or messages that trigger excessive computation. - **Trigger buffer overflows or out-of-bounds reads** in the binary decoder. **Mitigations:** - Never allow untrusted peers to write to the original document. - Use separate document forks for suggestion-only users. - Do not rely on server-side update filtering as a security measure. - Authenticate and authorize peers before granting write access. - Validate incoming binary messages and reject malformed data. - Implement size limits on incoming updates where possible. - Fuzz test the decoder and update application paths. ### 3.2 Supply Chain (Dependencies & npm Publishing) Yjs is a widely-used library. Compromising it would impact many downstream projects. **Yjs only depends on packages that are maintained by the Yjs maintainers themselves** (such as `lib0` and `@y/protocols`). This significantly reduces supply chain risk, as there are no third-party runtime dependencies that could be independently compromised. - **Compromised npm publish token** leading to a malicious release. - **Typosquatting** of the package name. However, the project does use third-party **dev dependencies** (linters, test tools, build tools, etc.). A compromised dev dependency could execute malicious code on a maintainer's machine during development, potentially leading to credential theft or tampered releases. It is important to only install trusted dev dependencies and to review them carefully. **Mitigations:** - All runtime dependencies are maintained by the Yjs team, eliminating third-party supply chain risk. - Only install trusted, well-maintained dev dependencies and review new additions carefully. - Enable MFA on all maintainer npm and GitHub accounts. - Use `npm provenance` or signed releases where supported. - Pin dependency versions and review lockfile changes in PRs. - Monitor for typosquat packages. ### 3.3 Pull Requests & Code Contributions - **Malicious code** submitted via pull requests (obfuscated backdoors, subtle logic changes). - **CI exploitation** through crafted PR workflows that exfiltrate secrets. **Mitigations:** - Require at least one maintainer review before merging. - Do not run CI with secrets on PRs from forks. - Use branch protection rules on `main`. - Review changes carefully, especially to binary encoding/decoding, crypto, and publishing scripts. ### 3.4 GitHub Actions & CI/CD - **Secret exfiltration** from workflow runs. - **Workflow injection** via untrusted input in PR titles, branch names, or commit messages. **Mitigations:** - Follow the principle of least privilege for workflow permissions. - Avoid using `pull_request_target` with checkout of PR code. - Pin action versions to specific commit SHAs. - Limit secret access to required workflows only. ### 3.5 Maintainer Account Compromise - **Account takeover** of a GitHub or npm maintainer account. - Used to merge malicious PRs, publish backdoored packages, or modify CI. **Mitigations:** - Require MFA for all maintainers (GitHub and npm). - Limit the number of accounts with publish access. - Periodically review organization members and their permissions. ## 4. Risk Assessment | Threat | Likelihood | Impact | Priority | |--------|-----------|--------|----------| | Malicious CRDT update from peer | Medium | High (data corruption) | High | | Compromised npm publish | Low | Critical (supply chain) | High | | Malicious pull request merged | Low | High | Medium | | Dependency compromise | Low | High | Medium | | CI secret exfiltration | Low | Medium | Medium | | Maintainer account takeover | Low | Critical | High | ## 5. Out of Scope The following are the responsibility of the application developer using Yjs, not the Yjs library itself: - **Authentication and authorization** of peers connecting to a collaboration session. - **Transport-layer security** (TLS/WSS) for data in transit. - **Server-side access control** for who can read or write documents. - **Application-level input validation** (e.g., sanitizing rich text content for XSS). ## 6. Review Schedule This threat model should be reviewed: - At least once per year. - When a new major version is released. - When a security incident occurs. - When significant new features or dependencies are added.