¿Cuál es la mejor manera de aprender la programación segura de sistemas?

Debes aprender y comprender todas (o al menos la mayoría) las formas en que se ataca el software. A nivel del sistema, debe preocuparse por los desbordamientos de búfer, los errores relacionados con enteros (desbordamiento, subdesbordamiento, truncamiento, desajuste firmado / sin firmar, etc.), corrupción de memoria, inyección de comandos y una gran cantidad de otras clases de vulnerabilidad y ataque que Estoy fallando en pensar en la parte superior de mi cabeza.

Todos estos esencialmente se reducen a la validación de entrada. NUNCA confíe en los datos hasta que se verifique que se ajuste a las suposiciones que haga sobre los datos. Definitivamente, no confíe en ningún dato que pueda haber sido manipulado en cualquier momento por un usuario. Esto incluye entrada de teclado, archivos, datos de red y cualquier otro dispositivo de entrada.

Si está haciendo algo con cifrado, lea Criptografía aplicada de Bruce Schneier. En resumen, no escriba sus propios algoritmos, y tenga cuidado de que su procedimiento para manejar datos encriptados no se omita ni manipule fácilmente.

Al tratar con sistemas de permisos, verifique y haga cumplir cualquier suposición. Asegúrese de que sus reglas realmente restringen a los usuarios adecuadamente.

En resumen, no haga suposiciones no verificadas y piense como un mal tipo.