chore(release): v0.7.19
Sécurité : la clé privée ne subsiste plus en clair dans %APPDATA%. Le .conf généré est écrasé puis supprimé dès que wireguard.exe l'a consommé (il en garde sa propre copie chiffrée DPAPI), et l'import propose d'effacer le fichier source. Windows uniquement : sous Linux /etc/wireguard/<iface>.conf reste requis par wg-quick down. Corrige aussi ImpersonateNamedPipeClient, qui appartient à win32security et non à win32pipe (vérifié par introspection). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,34 @@ def get_config_dir() -> str:
|
||||
return path
|
||||
|
||||
|
||||
def secure_delete(path: str) -> bool:
|
||||
"""Écrase puis supprime un fichier contenant un secret.
|
||||
|
||||
Sert aux fichiers `.conf` WireGuard, qui portent la clé privée en
|
||||
clair : ils ne doivent pas subsister une fois consommés.
|
||||
|
||||
L'écrasement préalable est explicitement « au mieux » : sur SSD (wear
|
||||
levelling, TRIM) ou sur un système de fichiers journalisé ou
|
||||
copy-on-write, l'ancien contenu peut survivre dans des blocs que le
|
||||
système n'expose plus. Il protège d'une récupération simple de
|
||||
l'espace libre, pas d'une analyse forensique — la seule protection
|
||||
solide reste le chiffrement du disque.
|
||||
"""
|
||||
try:
|
||||
size = os.path.getsize(path)
|
||||
with open(path, "r+b") as f:
|
||||
f.write(b"\0" * size)
|
||||
f.flush()
|
||||
os.fsync(f.fileno())
|
||||
except OSError:
|
||||
pass # fichier absent ou verrouillé : on tente quand même la suppression
|
||||
try:
|
||||
os.remove(path)
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
|
||||
def get_wg_config_dir() -> str:
|
||||
if is_windows():
|
||||
base = os.environ.get("PROGRAMDATA", r"C:\ProgramData")
|
||||
|
||||
Reference in New Issue
Block a user