blob: 81e987be5d6298f2096d8e728136cb1a0e94ad53 [file] [view] [edit]
# Security Threat Model
## Asset Definition & Scope
This threat model covers the **`Appsheet.DotNetFrameworkUriEscaping`**
repository
(`sso://gnocchi-internal/third_party/dot-net-framework-uri-escaping`), a C#
shared library targeting `.NET Standard 2.0`. The repository contains a custom
fork of Microsoft .NET Framework 4.6.2 Reference Source (`NetFrameworkUri.cs`)
configured to execute in legacy V2 quirks mode (RFC 2396). It provides
`NetFrameworkUri.EscapeDataString()` to escape query parameters identically to
legacy .NET Framework (notably preserving unreserved characters such as `(` and
`)`), which is utilized by AppSheet to verify cryptographic signatures on legacy
image URLs generated prior to AppSheet's migration to .NET Core.
## Prioritization Signals
- **1P OSS:** No
- **1P Proprietary Shipped Software:** No (Server-side library powering
AppSheet cloud services)
- **High-Risk Code Surface:** Yes. Utilizes C# `unsafe` pointer operations,
stack allocations (`stackalloc`), raw buffer copying (`Buffer.BlockCopy`),
and custom Unicode surrogate/UTF-8 byte processing on untrusted external URL
strings.
- **Perimeter Exposure:** Yes (Exposed via AppSheet public-facing internet
service and customer endpoints).
- **Data Sensitivity:** Medium/High (Processes customer image URLs, query
parameters, HMAC/signature tokens, and customer data identifiers).
- **Untrusted Input Handling:** Yes (Consumes raw, untrusted URI strings and
query parameters from external HTTP requests).
- **Business Value:** Critical for preserving backwards compatibility and
security of AppSheet's legacy image URL signature verification pipeline,
preventing unauthorized access to customer image assets.
## Scanning Harness Prompts
- Focus on pointer arithmetic, buffer boundary calculations, and array
allocations in `NetFrameworkUri.EscapeString` and
`NetFrameworkUri.EnsureDestinationSize`. Check for potential off-by-one or
integer overflow vulnerabilities when indexing characters, calculating
surrogate pair offsets (`pStr[i + count - 1]`), or converting UTF-8 bytes
(`Encoding.UTF8.GetBytes`).
- Inspect unsafe stack allocation `stackalloc byte[160]`
(`c_MaxUnicodeCharsReallocate * c_MaxUTF_8BytesPerUnicodeChar`) and verify
whether input strings with surrogate pairs or long sequences of non-ASCII
characters can cause buffer overruns in `Encoding.UTF8.GetBytes(pStr + i,
count, bytes, 160)`.
- Analyze surrogate pair handling (`0xD800` to `0xDBFF`) for malformed Unicode
inputs (e.g., truncated high surrogates, unpaired surrogates, non-shortest
form UTF-8) to ensure `UriFormatException` is reliably thrown without memory
corruption or infinite loops (`for (; count < maxSize && pStr[i + count] >
'\x7f'; ++count)`).
- Evaluate differential URI escaping/unescaping behavior between RFC 2396 (V2
quirks mode) and modern RFC 3986 / .NET Core parsers to ensure that
canonicalization differences cannot be exploited for signature validation
bypass or request spoofing in downstream AppSheet components.
## Entry Points and Untrusted Inputs
| Entry Point | Type | Trusted? | Validation |
| ---------------------------------------- | -------- | ---------- | -------------------- |
| `NetFrameworkUri.EscapeDataString(string | Public | No | Validates null, |
: stringToEscape)` : C# : (Untrusted : empty string, :
: : Static : query : surrogate pairs, :
: : Method : parameters : UTF-8 encodability, :
: : : and URLs : and enforces :
: : : from : `c_MaxUriBufferSize` :
: : : external : (65,520 chars) :
: : : users) : :
| `NetFrameworkUri.EscapeString(...)` | Internal | No (Raw | Enforces `end - |
: : Unsafe : string and : start < :
: : Static : substring : c_MaxUriBufferSize`; :
: : Method : bounds) : validates high/low :
: : : : surrogates and UTF-8 :
: : : : byte conversion :
## Trust Boundaries and Auth Assumptions
- **Authentication**: None within this library (assumed to be invoked by
AppSheet backend during authentication and signature verification
pipelines).
- **Authorization**: None within this library.
- **Implicit trust**: The library assumes callers pass .NET string objects
within valid memory; however, the string content itself is treated as
completely untrusted.
- **Boundary crossings**: External user/client request AppSheet HTTP edge /
API handler `NetFrameworkUri.EscapeDataString` Signature validator /
image storage fetcher.
## Sensitive Data Paths
| Data Type | Source | Destination | Protection |
| ---------- | -------- | ---------------------------------- | -------------------- |
| Customer | External | `NetFrameworkUri.EscapeDataString` | In-memory |
: image URLs : client : -> Signature verification hash / : processing; input :
: & query : requests : HMAC engine : size limited by :
: parameters : : : `c_MaxUriBufferSize` :
| Image URL | External | Signature verification comparison | Processed in string |
: signatures : client : logic : / character buffers :
: & HMAC : requests : : :
: tokens : : : :
## Privileged Actions
| Action | Location | Guard |
| -------------------- | --------------------------------------- | ------------------------------- |
| Unsafe stack | `NetFrameworkUri.EscapeString` | Fixed allocation size |
: allocation : : (`c_MaxUnicodeCharsReallocate * :
: (`stackalloc`) : : c_MaxUTF_8BytesPerUnicodeChar` :
: : : = 160 bytes); bounded by :
: : : `maxSize` calculation :
| Direct pointer | `NetFrameworkUri.EscapeString`, | Fixed pointer pins (`fixed |
: dereferencing & : `NetFrameworkUri.EnsureDestinationSize` : (char* pStr = input)`); bounded :
: traversal (`char*`, : : loop index and `prevInputPos` :
: `byte*`) : : tracking :
| Raw buffer copy | `NetFrameworkUri.EnsureDestinationSize` | Reallocation logic with |
: (`Buffer.BlockCopy`) : : `destPos << 1` byte count :
## Priority Review Areas
1. **Unsafe Pointer Manipulation and Buffer Resizing:** Verify bounds checks in
`NetFrameworkUri.EscapeString` and `NetFrameworkUri.EnsureDestinationSize`
under edge cases (e.g. repeated resizing, maximum buffer size, mixed ASCII
and non-ASCII sequences).
2. **Malformed Unicode & Surrogate Pair Handling:** Review behavior when
processing lone high surrogates, lone low surrogates, or invalid UTF-8 byte
sequences at string boundaries (`count == 1 || count == end - i`).
3. **V2 Quirks Differential & RFC 2396 Compliance:** Review the character sets
in `RFC2396UnreservedMarks` (`-_.~*'()!`) vs `RFC3986UnreservedMarks`
(`-_.~`) and ensure signature calculations in AppSheet cannot be
desynchronized between .NET Framework and .NET Core.
4. **Denial of Service (DoS) via Exception Flooding or Buffer Limits:** Check
if large or invalid URI payloads (approaching `c_MaxUriBufferSize = 0xFFF0`)
can cause high CPU usage or excessive garbage collection.