Skip to content

fix(api_client,cli): restringir permissoes do material sensivel em disco - #5

Open
marvinrez wants to merge 1 commit into
danielcarletti:mainfrom
marvinrez:fix/private-files-on-disk
Open

fix(api_client,cli): restringir permissoes do material sensivel em disco#5
marvinrez wants to merge 1 commit into
danielcarletti:mainfrom
marvinrez:fix/private-files-on-disk

Conversation

@marvinrez

Copy link
Copy Markdown

Dois pontos gravavam dado sensivel com permissao mais aberta do que precisa.

O primeiro sao os arquivos de mTLS. A chave privada do A1 sai do .pfx em PKCS#8 sem criptografia, porque o requests precisa dela assim, e ia para dois NamedTemporaryFile soltos em /tmp - que e world-writable - removidos so no exit. Se o processo caisse, ou se o NfseApiClient fosse usado sem o with, a chave ficava em disco. Agora vao para um diretorio proprio criado com mkdtemp (0700), com os arquivos em 0600, removidos no exit, no atexit do processo, e tambem se a extracao falhar no meio.

O segundo sao as saidas. cli.py criava results/ e gravava com o modo do umask, tipicamente 0755 e 0644 - a DPS assinada, com CNPJ, valores e dados do tomador, e o resultado.json ficavam legiveis por qualquer usuario da maquina. Passam a 0700 e 0600.

Nota sobre _mkdir_private: mkdir(parents=True) aplica o modo so ao ultimo nivel, entao os intermediarios sairiam com o padrao do umask. A funcao cria um nivel por vez, e so os que faltam, para nao alterar o modo de diretorios que ja existiam por outro motivo.

Cinco testes cobrem os modos dos arquivos de mTLS, a remocao do diretorio ao sair do contexto, senha errada nao deixando diretorio para tras, os modos das saidas do CLI, e um results/ preexistente em 0755 sendo corrigido.

Dois pontos gravavam dado sensivel com permissao mais aberta do que precisa.

O primeiro sao os arquivos de mTLS. A chave privada do A1 sai do .pfx em
PKCS#8 sem criptografia, porque o requests precisa dela assim, e ia para dois
NamedTemporaryFile soltos em /tmp - que e world-writable - removidos so no
__exit__. Se o processo caisse, ou se o NfseApiClient fosse usado sem o with,
a chave ficava em disco. Agora vao para um diretorio proprio criado com
mkdtemp (0700), com os arquivos em 0600, removidos no __exit__, no atexit do
processo, e tambem se a extracao falhar no meio.

O segundo sao as saidas. cli.py criava results/ e gravava com o modo do umask,
tipicamente 0755 e 0644 - a DPS assinada, com CNPJ, valores e dados do tomador,
e o resultado.json ficavam legiveis por qualquer usuario da maquina. Passam a
0700 e 0600.

Nota sobre _mkdir_private: mkdir(parents=True) aplica o modo so ao ultimo
nivel, entao os intermediarios sairiam com o padrao do umask. A funcao cria um
nivel por vez, e so os que faltam, para nao alterar o modo de diretorios que ja
existiam por outro motivo.

Cinco testes cobrem os modos dos arquivos de mTLS, a remocao do diretorio ao
sair do contexto, senha errada nao deixando diretorio para tras, os modos das
saidas do CLI, e um results/ preexistente em 0755 sendo corrigido.

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants