forked from username/flaskpaste
docs: update for simplified MIME detection (v1.5.1)
This commit is contained in:
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
## Current State
|
## Current State
|
||||||
|
|
||||||
FlaskPaste v1.5.0 is deployed with comprehensive security hardening and abuse prevention.
|
FlaskPaste v1.5.1 is deployed with comprehensive security hardening and abuse prevention.
|
||||||
|
|
||||||
**Implemented:**
|
**Implemented:**
|
||||||
- Full REST API (CRUD operations)
|
- Full REST API (CRUD operations)
|
||||||
- Binary content support with magic-byte MIME detection
|
- Binary content support with text/binary MIME detection
|
||||||
- Client certificate authentication
|
- Client certificate authentication
|
||||||
- Minimal PKI (CA generation, certificate issuance, revocation)
|
- Minimal PKI (CA generation, certificate issuance, revocation)
|
||||||
- Content-hash deduplication (abuse prevention)
|
- Content-hash deduplication (abuse prevention)
|
||||||
|
|||||||
4
TODO.md
4
TODO.md
@@ -12,7 +12,7 @@ Unstructured intake buffer for ideas, issues, and observations. Items here are r
|
|||||||
- Design: compress-then-encrypt only (not compress-only)
|
- Design: compress-then-encrypt only (not compress-only)
|
||||||
- Compressed data has high entropy → bypasses entropy enforcement
|
- Compressed data has high entropy → bypasses entropy enforcement
|
||||||
- Must enforce encryption when compression enabled (CLI-side)
|
- Must enforce encryption when compression enabled (CLI-side)
|
||||||
- Server detects compression formats via magic bytes (REQUIRE_BINARY)
|
- Server rejects plaintext via REQUIRE_BINARY (UTF-8 detection)
|
||||||
- ETag support for conditional requests
|
- ETag support for conditional requests
|
||||||
- Neovim/Vim plugin for editor integration
|
- Neovim/Vim plugin for editor integration
|
||||||
- Webhook notifications for paste events
|
- Webhook notifications for paste events
|
||||||
@@ -53,8 +53,8 @@ Unstructured intake buffer for ideas, issues, and observations. Items here are r
|
|||||||
|
|
||||||
## External Dependencies
|
## External Dependencies
|
||||||
|
|
||||||
- Consider adding `python-magic` for better MIME detection (currently magic bytes only)
|
|
||||||
- cryptography package required for PKI features (optional otherwise)
|
- cryptography package required for PKI features (optional otherwise)
|
||||||
|
- For full MIME detection, consider `filetype` library (currently text/binary only)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -707,17 +707,16 @@ export FLASKPASTE_MIN_ENTROPY_SIZE=256 # Only check content >= this size (defaul
|
|||||||
- Plaintext (valid UTF-8) is rejected with 400
|
- Plaintext (valid UTF-8) is rejected with 400
|
||||||
- Only binary content (invalid UTF-8) is allowed
|
- Only binary content (invalid UTF-8) is allowed
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
```bash
|
```bash
|
||||||
export FLASKPASTE_REQUIRE_BINARY=1 # Reject plaintext (0=disabled)
|
export FLASKPASTE_REQUIRE_BINARY=1 # Reject plaintext (0=disabled)
|
||||||
export FLASKPASTE_REQUIRE_BINARY=1 # Reject recognizable formats (0=disabled)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Response (400 Bad Request):**
|
**Response (400 Bad Request):**
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"error": "Recognizable format not allowed",
|
"error": "Recognizable format not allowed",
|
||||||
"detected": "text/plain",
|
"detected": "text/plain",
|
||||||
"hint": "Encrypt content before uploading (fpaste encrypts by default)"
|
"hint": "Encrypt content before uploading (fpaste encrypts by default)"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -729,16 +728,11 @@ export FLASKPASTE_REQUIRE_BINARY=1 # Reject recognizable formats (0=disabled)
|
|||||||
| Binary | Valid UTF-8 text | Reject plaintext |
|
| Binary | Valid UTF-8 text | Reject plaintext |
|
||||||
|
|
||||||
Use both together for maximum encryption enforcement:
|
Use both together for maximum encryption enforcement:
|
||||||
|--------|---------|-----------------|
|
|
||||||
| Entropy | Random-looking data | Compressed files pass |
|
|
||||||
| Binary | No magic bytes + invalid UTF-8 | Minimal |
|
|
||||||
|
|
||||||
Use both together for maximum encryption enforcement:
|
|
||||||
```bash
|
```bash
|
||||||
export FLASKPASTE_REQUIRE_BINARY=1
|
export FLASKPASTE_REQUIRE_BINARY=1
|
||||||
export FLASKPASTE_MIN_ENTROPY=6.0
|
export FLASKPASTE_MIN_ENTROPY=6.0
|
||||||
export FLASKPASTE_MIN_SIZE=64
|
export FLASKPASTE_MIN_SIZE=64
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
# MIME Detection Security Assessment
|
# MIME Detection Security Assessment
|
||||||
|
|
||||||
|
> **Note (v1.5.1):** Magic byte detection has been simplified to UTF-8 validation only.
|
||||||
|
> Content is now classified as `text/plain` (valid UTF-8) or `application/octet-stream` (binary).
|
||||||
|
> Security headers (nosniff, CSP) provide the primary defense against MIME confusion attacks.
|
||||||
|
> This document is retained for historical reference.
|
||||||
|
|
||||||
Penetration testing of FlaskPaste's magic byte-based MIME detection system.
|
Penetration testing of FlaskPaste's magic byte-based MIME detection system.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -328,14 +328,13 @@ DEDUP_MAX = 3 # Max duplicates allowed
|
|||||||
| X-Content-Type-Options | nosniff | Yes |
|
| X-Content-Type-Options | nosniff | Yes |
|
||||||
| Content-Security-Policy | default-src 'none' | Yes |
|
| Content-Security-Policy | default-src 'none' | Yes |
|
||||||
| X-Frame-Options | DENY | Yes |
|
| X-Frame-Options | DENY | Yes |
|
||||||
| Magic byte detection | First 16 bytes, 45 signatures | Yes |
|
| MIME detection | UTF-8 validation (text/binary) | Yes |
|
||||||
| Input sanitization | Werkzeug header handling | Yes |
|
| Input sanitization | Werkzeug header handling | Yes |
|
||||||
| SQL injection prevention | SQLAlchemy parameterized queries | Yes |
|
| SQL injection prevention | SQLAlchemy parameterized queries | Yes |
|
||||||
| SSTI prevention | No user content in templates | Yes |
|
| SSTI prevention | No user content in templates | Yes |
|
||||||
| Path traversal prevention | ID validation regex | Yes |
|
| Path traversal prevention | ID validation regex | Yes |
|
||||||
| Constant-time password check | PBKDF2 600k iterations | Yes |
|
| Constant-time password check | PBKDF2 600k iterations | Yes |
|
||||||
| Burn-after-read race condition | HEAD triggers deletion | Yes |
|
| Burn-after-read race condition | HEAD triggers deletion | Yes |
|
||||||
| RIFF container detection | Subtype check (WEBP/AVI/WAVE) | Yes |
|
|
||||||
| Clipboard command injection | Trusted path validation | Yes |
|
| Clipboard command injection | Trusted path validation | Yes |
|
||||||
| Memory exhaustion prevention | Max entries on all dicts | Yes |
|
| Memory exhaustion prevention | Max entries on all dicts | Yes |
|
||||||
| Race condition protection | Threading locks on counters | Yes |
|
| Race condition protection | Threading locks on counters | Yes |
|
||||||
|
|||||||
@@ -191,28 +191,27 @@ User Input Flow:
|
|||||||
|
|
||||||
## MIME Detection Security
|
## MIME Detection Security
|
||||||
|
|
||||||
Content is detected by magic bytes, not user-supplied Content-Type:
|
Content is detected by UTF-8 validation (text vs binary):
|
||||||
|
|
||||||
```
|
```
|
||||||
User uploads "image.png" with PHP payload
|
User uploads content
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
[Magic byte detection] --> Not PNG magic --> text/plain
|
[UTF-8 validation] --> Valid UTF-8 --> text/plain
|
||||||
|
|
| Invalid --> application/octet-stream
|
||||||
|
v
|
||||||
[X-Content-Type-Options: nosniff] --> Browser won't sniff
|
[X-Content-Type-Options: nosniff] --> Browser won't sniff
|
||||||
|
|
|
|
||||||
[CSP: default-src 'none'] --> No script execution
|
[CSP: default-src 'none'] --> No script execution
|
||||||
```
|
```
|
||||||
|
|
||||||
### Polyglot Attack Mitigations
|
### Security Headers (Primary Defense)
|
||||||
|
|
||||||
| Attack | Detection | Result |
|
| Header | Value | Protection |
|
||||||
|--------|-----------|--------|
|
|--------|-------|------------|
|
||||||
| PNG + HTML | PNG magic detected | image/png |
|
| X-Content-Type-Options | nosniff | Prevents MIME sniffing |
|
||||||
| GIF + JS | GIF magic detected | image/gif |
|
| Content-Security-Policy | default-src 'none' | Blocks script execution |
|
||||||
| PDF + ZIP | PDF magic detected | application/pdf |
|
| X-Frame-Options | DENY | Prevents framing |
|
||||||
| SVG + script | No XML magic | text/plain |
|
|
||||||
| JPEG + PHP | JPEG magic detected | image/jpeg |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user