[Python-es] Código Python protegido

lasizoillo lasizoillo en gmail.com
Sab Feb 25 17:48:47 CET 2012


El día 25 de febrero de 2012 15:51, Alvaro Manrique
<sanreikaj.foros en gmail.com> escribió:
> lasizoillo,
>
> Totalmente de acuerdo contigo, sobre todo la parte en la de chantajear al
> cliente, no no no Sres. eso no se hace,
> pero te invito a leer completo el debate sobre todo la parte donde dije que
> el código va a estar en un servidor bajo
> mi control (es una aplicación web) pero se puede presentar el escenario
> donde se tenga que instalar en un servidor
> de alguno de los clientes en ese caso es que aplica protejer ciertas partes
> del código,
> lo dije desde un principio Ciertas Partes del Código
>
> Lo de falsa seguridad mmmm, no lo creo, esta es solo una de las medidas de
> seguridad.
>

1.- Antes de discutir nada hay que centrar conceptos.
2.- Cerrar el códido que maneja una información no implica asegurar la
información manejada (falsa sensación de seguridad).
3.- Cerrar código puede impedir el acceso a cierta información
(formatos cerrados vs abiertos).
4.- Hay que analizar los costes/beneficios de cerrar el código (en mi
opinión es despilfarro).

El punto 1 parece realizado. El punto 2 parece aclarado si dices que
es solo una medida más. El punto 3 parece no ser relevante. Vayamos al
punto 4:

Los empaquetadores como py2exe o similares para otros sistemas
operativos hacen lo siguiente: crean un ejecutable con un interprete
de python e introducen los programas de python que son interpretados.
La ingeniería inversa de estos métodos son sencillos. Aun cuando
ejecuten los bytecodes de python y no el fuente de python, conseguir
los segundos a partir de los primeros es inmediato. Py2exe por si solo
carece de utilidad.

Se puede encriptar código python mediante el encoder:
https://breakingcode.wordpress.com/2010/07/23/quickpost-hiding-your-python-source-with-rot13/
Como te imaginaras el encoder es un código python que es utilizado
para desencriptar el propio programa antes de ser pasado al
intérprete. Da igual si lo que haces es crearte y registrar tu propio
encoding que no sufre de los problemas debilidad del rot13 (se ve
claramente si encriptas dos veces un mensaje para hacerlo más seguro),
porque será fácil usar trozos de tu propio código para desproteger tu
código. El encoder se encuentra en la zona de código no "asegurada".

Se puede usar cosas como cython, shedskin, ... para compilar tu código
fuente en un binario que sea más dificil de analizar. La diferencia es
que se hará ingenieria inversa leyendo código máquina en vez de
python. Es una molestia, pero no una barrera insalvable. A parte de
eso, ninguno de los compiladores de python que hay tienen soporte
total de python a día de hoy, por lo que te complicará el ciclo de
desarrollo limitándote las funcionalidades de python que puedes
utilizar en tu desarrollo.

Puedes mantener el código que quieres que permanezca oculto mediante
procedimientos remotos (xml-rpc por ejemplo). Eso garantiza que el
usuario del código no tiene acceso al mismo y no puede realizar una
ingeniería inversa de el (solo puede hacer análisis de caja negra). La
contrapartida es que el programa no funcionara en modo offline.

Puedes hacerte un paquete que incluya un binario capaz de ejecutar
código python cifrado con un secreto que es solicitado a un servicio
remoto o a un dongle conectado al ordenador y que descifre el código
python antes de ser ejecutado. Ese código lo puedes meter en zonas de
memoria marcadas para no ser swapeadas y al código base binario
ponerle varias medidas de seguridad: antidebugging, enpaquetado de
binarios, ... Todo esto solo sirve para hacer más dificil (no
inviable) el acceso al código, es técnicamente posible de hacer, pero
jamás lo he realizado porque la inversión en desarrollo nunca me ha
parecido rentable. Aparte de eso, siempre me ha parecido más divertido
saltarme las medidas de seguridad que implementarlas. El tiempo que se
pierde en impedir el acceso al código es tiempo que no estás empleando
en quitar a tu código de problemas de seguridad que puedan ser
detectados por un fuzzer y explotados sin aceso al código fuente.

Un saludo,

Javi


Más información sobre la lista de distribución Python-es