Хранилище секретов: очищать временный plaintext при исключениях и отмене

Aperta
#395 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
csharp
Ambito
backend, security

Direzione di ricerca

Start with src/Bydlo.Platform/SecretStores.cs, focusing on FileSecretStoreBase.SaveAsync, LoadAsync, and AesFileSecretStore.Unprotect; trace which plaintext arrays each operation owns and where cleanup currently happens. Then find the isolated tests for secret stores and add fault-injection coverage using fake IDataProtection for protection, write or cancellation, and deserialization failures. Done means owned temporary buffers are cleared on success and failure, returned values and stored format stay intact, and existing error behavior is preserved.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Проблема

В src/Bydlo.Platform/SecretStores.cs очистка временного plaintext выполняется только на успешном пути:

  • FileSecretStoreBase.SaveAsync: после Protect и WriteAllBytesAsync. Ошибка защиты, записи или отмена пропускает ZeroMemory.
  • FileSecretStoreBase.LoadAsync: после десериализации. Ошибка JSON пропускает очистку уже расшифрованного массива.
  • AesFileSecretStore.Unprotect: выделяет plaintext-массив; владение и очистку при ошибке аутентификации необходимо сделать явными, не полагаясь на побочные гарантии конкретного backend.

Это дефект времени жизни временных буферов. Утечка в лог/на диск или возможность чтения чужим процессом этим анализом не доказана. ProfileSecrets возвращает строки: обнуление временного массива не является гарантией стирания всех копий секретов.

Решение

Охватить принадлежащие хранилищу plaintext-массивы try/finally с CryptographicOperations.ZeroMemory, включая исключения и отмену. Успешно возвращаемый буфер передавать следующему владельцу с явным контрактом очистки; не очищать данные вызывающего кода и не менять возвращаемые секреты.

Сохранить текущую семантику ошибок и доработки #344 / PR #375: задача очистки памяти не должна снова превращать нечитаемый обязательный секрет в успешный пустой результат.

Готово, когда

  • Синтетические fault-injection тесты проверяют очистку после ошибки защиты, ошибки/отмены записи и ошибки десериализации после расшифровки.
  • На успешном пути временные plaintext-буферы очищены, а возвращённые значения и сохраняемый формат не повреждены.
  • Тесты используют фейковый IDataProtection, который позволяет проверить принадлежащий операции массив; не сканируют память и не читают пользовательские секреты.
  • Поведение DPAPI/AES-хранилищ, атомарной записи и диагностики ошибок не ухудшается; не добавляются секреты в исключения и логи.

Для этой задачи достаточно C#, смена языка и реальных системных хранилищ в тестах не нужна. Все проверки — изолированно, с BYDLO_SAFE_DEV=1, без сетевых движков.

Lingua principale
C#
Stelle
5
Fork
1
Merge medio
30m
PR unite (30g)
171

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di endercodezz/BYDLO

Tutte le issue di endercodezz/BYDLO

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.