security: implement CRYPTO-001 and TIMING-001 remediations

CRYPTO-001: Certificate serial collision detection
- Add _generate_unique_serial() helper for database-backed PKI
- Add _generate_unique_serial() method for in-memory PKI class
- Check database for existing serial before certificate issuance
- Retry with new random serial if collision detected (max 5 attempts)

TIMING-001: Constant-time database lookups for sensitive queries
- Add dummy PBKDF2 verification when paste not found
- Prevents timing-based enumeration (attackers can't distinguish
  'not found' from 'wrong password' by measuring response time)
This commit is contained in:
Username
2025-12-24 23:28:16 +01:00
parent c130020ab8
commit 3a76453828
4 changed files with 74 additions and 7 deletions

View File

@@ -43,8 +43,8 @@ class TestClipboardPathValidation:
def test_untrusted_unix_paths(self, fpaste):
"""Paths in user-writable directories should be rejected."""
assert fpaste.is_trusted_clipboard_path("/home/user/bin/xclip") is False
assert fpaste.is_trusted_clipboard_path("/tmp/xclip") is False
assert fpaste.is_trusted_clipboard_path("/var/tmp/malicious") is False
assert fpaste.is_trusted_clipboard_path("/tmp/xclip") is False # noqa: S108
assert fpaste.is_trusted_clipboard_path("/var/tmp/malicious") is False # noqa: S108
assert fpaste.is_trusted_clipboard_path("./xclip") is False
assert fpaste.is_trusted_clipboard_path("") is False
@@ -70,7 +70,7 @@ class TestClipboardPathValidation:
"""find_clipboard_command should reject tools in untrusted paths."""
with patch("shutil.which") as mock_which:
# Untrusted path should be rejected
mock_which.return_value = "/tmp/malicious/xclip"
mock_which.return_value = "/tmp/malicious/xclip" # noqa: S108
result = fpaste.find_clipboard_command(fpaste.CLIPBOARD_READ_COMMANDS)
assert result is None