Determinar se um diretório é seguro ou não
Se sua aplicação precisa armazenar dados confidenciais em uma pasta, precisamos saber se estamos armazenando em uma pasta que realmente é segura, e só pode ser acessada por usuários permitidos.
Antes de armazenar dados confidenciais em um diretório, devemos validar as permissões em toda a árvore de diretórios, e não apenas no diretório que será armazenado. Devemos validar toda a arvore porque, por exemplo: se vou armazenar os dados no diretório home/user/coisa/dadosConf e se o diretório home/user/coisa é editável por algum outro usuário, ele poderia renomear o diretório dadosConf e quebrar todo o programa e os dados não estarão mais accessíveis ao programa.
Uma maneira de prevenir este problema é utilizar a função spc_is_safedir( ) que verifica toda a arvore do diretório e valida que cada pasta contem acesso de escrita apenas para o superuser. A função retorna -1 se houve algum erro, 0 se o diretório não é seguro e 1 se o diretório é seguro.
Apagando arquivos com segurança
Se em sua aplicação, um dado que não pode ser recuperado por conter informações confidenciais, deve ser removido com segurança para que ele não possa ser restaurado com ferramentas que podem recuperá-los até mesmo quando deletados permanentemente. Para resolver este problema devemos antes de apagar o arquivo, adicionar dados randômicos a ele e então após isto deleta-lo.
Quando deletamos um arquivo do sistema, ele libera o espaço da memória mas ainda podemos recuperar o arquivo, então por isso dados sem sentido devem ser adicionados antes da deleção. O
Linux disponibiliza uma ferramenta para fazer isto, o shred, este comando adiciona dados aleatórios ao arquivo selecionado.
Removendo arquivos com segurança
Se em sua aplicação, um dado que não pode ser recuperado por conter informações confidenciais, deve ser removido com segurança para que ele não possa ser restaurado com ferramentas que podem recuperá-los até mesmo quando deletados permanentemente. A maioria das operações de remoção de arquivos não fazem nada com os dados, apenas liberam espaço na memória.
Para resolver este problema, em seu programa uma lógica poderia ser adicionada para que antes do arquivo ser removido, preencha ele com dados aleatórios, geralmente essas operações preenchem todo o arquivo com zeros.
O Linux oferece alguns comandos para remover um arquivo com mais segurança, por exemplo o "shred", este comando destrói o conteúdo do arquivo de uma maneira que fica praticamente impossível de ser recuperado, até mesmo com ferramentas avançadas.
Exemplo de um arquivo antes do comando shred e depois:
Conclusão
Apenas algumas pequenas boas práticas foram apresentadas aqui neste artigo. Hoje em dia possuímos milhares de diferentes formas para se proteger de ameaças em nosso programa, mas também cada vez mais vemos usuários maliciosos tentando invadir o sistema das mais diferentes formas possíveis, por isso a segurança de um programa deve ser levada a sério quando se tem dados sensíveis envolvidos.
Bibliografia
(Howard 1997) Howard, J. D. An Analysis of Security Incidents on the Internet 1989-1995. PhD Diss., Carnegie Mellon
Robert C. Seacord Secure Coding in C and C++ Second Edition 2013
Matt Messier, John Viega Secure Programming Cookbook for C and C++ 2003