blob: 4f5704db6a427b8d88e8df90d1def443075cf119 [file] [view] [edit]
# Security Threat Model
## Asset Definition & Scope
- **Component:** EPPlus (.NET Open XML Spreadsheet Library, AppSheet fork)
- **Repository:** Git-on-Borg
(`https://gnocchi-internal.googlesource.com/third_party/epplus`, branch
`main`)
- **Scope:** Shared .NET library providing server-side reading, parsing,
generation, manipulation, and formula evaluation of Microsoft Excel OpenXML
(`.xlsx`, `.xlsm`) spreadsheets within AppSheet backend services.
## Prioritization Signals
- **1P OSS:** No (Third-party open-source library maintained as an internal
customized fork for Google AppSheet)
- **1P Proprietary Shipped Software:** No (Server-side shared library bundled
into AppSheet backend services)
- **High-Risk Code Surface:** Yes (Complex file format parsing including ZIP
archive extraction, XML document/stream deserialization, XPath queries, cell
store indexing, and formula lexical analysis/expression evaluation)
- **Perimeter Exposure:** Yes (Indirectly exposed to the public Internet via
AppSheet application endpoints processing end-user and customer spreadsheet
uploads)
- **Data Sensitivity:** High (Parses and generates customer spreadsheet data
containing confidential business data, PII, financial figures, and
application schemas)
- **Untrusted Input Handling:** Yes (Processes untrusted Excel files,
compressed ZIP archives, XML parts, cell definitions, formatting rules, and
user-supplied formulas)
- **Business Value:** Core dependency for AppSheet's spreadsheet integration
and data source connectors; security defects (XXE, Zip Slip, formula
injection, or DoS) could lead to service disruption, customer data exposure,
or server compromise.
## Scanning Harness Prompts
- Focus on XML External Entity (XXE) and XML Entity Expansion (Billion Laughs
/ XML bomb) vulnerabilities across all `XmlDocument`, `XmlReader`, and
`XPath` operations (e.g., verify that `XmlReaderSettings.ProhibitDtd = true`
/ `DtdProcessing.Prohibit` and `XmlResolver = null` are strictly enforced
across `XmlHelper.cs`, `ZipPackage.cs`, `ExcelStyles.cs`,
`ExcelWorksheets.cs`, and table/drawing components).
- Focus on archive extraction safety in `ZipPackage.cs` (`ZipArchive`
handling) for Zip Slip path traversal vulnerabilities (e.g., handling
malformed entry full names or URI paths containing `../`), uncompressed size
limits, and zip bomb resource exhaustion.
- Focus on the formula parsing and execution engine
(`FormulaParsing/FormulaParser.cs`, `ExpressionGraph`, `LexicalAnalysis`)
for recursive stack overflow, unhandled exceptions, denial-of-service via
circular references, or unintended method invocation.
- Focus on memory exhaustion, integer overflows, or unchecked allocations in
`CellStore.cs` when processing large row/column indices or sparse matrices
crafted to cause OutOfMemory errors.
- Focus on CSV / formula injection risks when writing cell contents or
formatting export outputs.
## Entry Points and Untrusted Inputs
Entry Point | Type | Trusted? | Validation
------------------------------------------------------------ | ---------------------------- | -------- | ----------
`ExcelPackage(Stream)` / `ExcelPackage(FileInfo)` | API Constructor / File Input | No | Validates stream existence; delegates archive decompression to `ZipPackage`
`ZipPackage(Stream)` | Archive Decompressor | No | Checks for `[content_types].xml` and relationship parts; reads entry streams into byte arrays
`XmlHelper.LoadXmlSafe(XmlDocument, Stream)` | XML Deserialization | No | Configures `XmlReaderSettings.ProhibitDtd = true` before loading into `XmlDocument`
`FormulaParser.Parse(string)` / `ExcelRangeBase.Calculate()` | Formula Engine | No | Lexical tokenization and expression graph evaluation of formula strings
`ExcelWorksheet.Cells[...]` / `CellStore` | Data Ingestion | No | Range address parsing, dimension bounding, and cell value type mapping
## Trust Boundaries and Auth Assumptions
- **Authentication**: None at library level. Authentication is assumed to be
handled upstream by AppSheet API gateways and services before passing
document streams.
- **Authorization**: None at library level. Access control to spreadsheet data
is enforced by AppSheet application authorization layers.
- **Implicit trust**: The library assumes memory allocations and execution
timeouts are constrained by the host process container/sandbox, but must
guard against internal crashes or excessive resource consumption.
- **Boundary crossings**: Public customer uploads $\rightarrow$ AppSheet
service frontend $\rightarrow$ AppSheet backend worker $\rightarrow$ EPPlus
parsing engine $\rightarrow$ AppSheet in-memory data structures.
## Sensitive Data Paths
| Data Type | Source | Destination | Protection |
| --------------- | ---------------- | ------------------ | ------------------ |
| Customer | External File | AppSheet Memory / | In-memory |
: Spreadsheet : Upload / Data : `CellStore` : processing; :
: Content : Source : : protected by host :
: : : : sandbox and TLS :
: : : : transport :
| Spreadsheet | Excel File Parts | Formula Parsing | Evaluated in |
: Formulas & : : Engine : memory; restricted :
: Macros : : : to supported :
: : : : spreadsheet :
: : : : function library :
| Office Document | OpenXML | `OfficeProperties` | Parsed into |
: Metadata : Properties : object : strongly-typed :
: : : : metadata :
: : : : properties :
## Privileged Actions
| Action | Location | Guard |
| ------------------- | ----------------------- | -------------------------- |
| File Read / Stream | `ExcelPackage.Load` / | Validates stream integrity |
: Ingestion : `ZipPackage.ZipPackage` : :
| File Write / | `ExcelPackage.Save` / | File system permissions of |
: Serialization : `ExcelPackage.SaveAs` : running process :
| XML Deserialization | `XmlHelper.LoadXmlSafe` | DTD prohibition settings |
## Priority Review Areas
1. **XML Parser Hardening**: Verify all XML loading routines across the library
consistently use safe `XmlReader` settings prohibiting DTD processing and
external entity resolution.
2. **Zip Slip & Path Traversal**: Review `ZipPackage.cs` part URI parsing and
relationship mapping (`ReadRelation`) to ensure no arbitrary path escapes
occur during package part extraction.
3. **Formula Engine Resilience**: Audit `FormulaParsing` components for
recursive evaluation depth limits, CPU consumption attacks, and safe
handling of malformed formulas.
4. **Memory Allocation Limits**: Inspect `CellStore.cs` and worksheet data
structures for defensive memory allocation bounds when handling massive or
maliciously sparse spreadsheets.