Dado que Revo es un sistema de gestión de negocios HoReCa (restaurantes, etc.) y comercios Retail, lo que implica el control ventas, caja y usuarios, consideramos la seguridad como un punto clave en todos nuestros productos, tanto la técnica, como la funcional, evitando posibles procesos fraudulentos por parte de les trabajadores.

Servidores

Nuestros servidores están alojados en Rackspace, una de las empresas líderes en el sector de las plataformas cloud.

Solamente se puede acceder a los servidores mediante SSH con una clave rsa privada. Por otra parte, cada servidor dispone de su propia clave, con lo que no se puede utilizar para entrar en otros.

High Availability

Disponemos de una infraestructura de alta disponibilidad mediante 4 servidores web detrás de un balanceador de carga. Atacando a una instancia de MySQL, la cual se replica en 2 instancias slave de sólo lectura, cada una de las cuales puede reemplazar a la Master en cuestión de segundos, si ésta cae.

Todas las APIs externas entran a través de otro(s) servidor(es) para asegurar que un uso no adecuado de éstas pudiera desestabilizar el sistema principal.

Backups

Se realizan backups diarios de todas las cuentas y se mantiene una rotación de 2 semanas. Así como un backup semanal del servidor principal.

Backend

Revo utiliza el framework Laravel, que lleva implícitos un conjunto de elementos de seguridad detallados a continuación:

SQL Injection

Todas las consultas a la base de datos pasan por un filtro que las asegura evitando cualquier tipo de SQL injection.

Es decir, si un usuario entra como nombre `'jason@example.com'; drop table users; se realizaría la siguiente consulta:

SELECT * FROM users WHERE email = 'jason@example.com'; drop table users;

Sin embargo, con el filtro, queda el siguiente resultado, totalmente inofensivo:

SELECT * FROM users WHERE email = 'jason@example.com or 1=1'
Cross-Site Request Forgery

Todas las peticiones POST que no forman parte de la api pasan por el filtro del cross-site request. Esto evita que desde otra página web se pueda realizar un enlace a Revo con una acción maliciosa y que, con la autenticación guardada en las cookies de sesión, se pudiera llegar a realizar esta acción. Gracias a este filtro, solamente se podrán realizar las peticiones si se inicia desde Revo mismo.

Cross-Site Scripting

Un usuario podría intentar ejecutar código javascript mediante la técnica llamada cross-site scripting. Esto consiste en almacenar en la base de datos el script a ejecutar. Así, al mostrar este texto en la página web, se conseguiría ejecutar el código.

Por ejemplo, si un usuario pone como nombre de usuario <script>alert("spam spam spam!")</script>, al mostrarlo en la página web, se lanzaría el script.

My list <script>alert("spam spam spam!")</script>

Sin embargo, contamos con el filtro que todo lo que se escribe en la página web, que proviene de la base de datos se neutraliza y queda de la siguiente forma:

My list \<script\>alert("spam spam spam!")\</script\>

Password

Los passwords de los usuarios se guardan en la base de datos encriptados con Bcrypt, que es el standard de seguridad actual, mediante una clave privada almacenada en el código de la aplicación.

No hay forma alguna de poder ver ninguna contraseña en claro.

En caso que algún usuario no pueda recordar su contraseña, solamente se puede resetear por otra nueva.

Revo tiene tres passwords distintos, el password de backend, el de la aplicación, y el de Revo Control.

Por otra parte, si la identificación es incorrecta (por usuario o password), se muestra un mensaje genérico que evita que se pueda hacer un ataque de diccionario sabiendo qué usuarios están ya registrados.

Cookies

Todas las cookies se almacenan encriptadas.

Gestión de errores

Se utiliza una gestión de errores oculta, que los registra en la plataforma Rollbar, mostrándole al usuario final solamente una página genérica sin ningún tipo de pista sobre el mismo.

Control de subida de ficheros maliciosos

Revo sólo permite subir ficheros de imagen y, si se sube cualquier otro tipo de fichero, éste es ignorado completamente y se informa un error.

Autorización de dispositivos en el backend

Todos los dispositivos que se conectan al backend quedan registrados y se puede desactivar su acceso en cualquier momento a través de una pantalla del backend.

App

Ya que se trata de una aplicación para iOS totalmente nativa, cuenta por defecto con todos los puntos de seguridad de iOS:

Security guide
Seguridad en iOS

Además, también seguimos protocolos para que los datos sensibles que se guardan en la memoria persistente, se guarden encriptados con un algoritmo estándar en la industria AES de 256.

Estos datos, en la memoria física, a partir de iOS 9.3 ya no son accesibles de forma fácil.

Compilación con los mecanismos de seguridad del SDK de Apple

  • Flag -fPIE -pie: La aplicación se ha compilado con el flag PIE (Position Independent Executable). Esto activa el ASLR (Address Space Layout Randomization), un mecanismo de protección de memoria para la prevención de exploits.
  • Flag -fstack-protector-all: La aplicación se ha compilado con el flag SSP (Stack Smashing Protector) que previene de ataques de Stack Overflow y Stack Smashing.
  • Flag -fobjc-arc: La aplicación se ha compilado con el flag ARC (Automatic Reference Counting). ARC es una característica del compilador que proporciona gestión automática de memoria para objetos Objective-C y previene de ataques de exploit y vulnerabilidades de corrupción de memoria.

Usuarios

Para poder utilizar la aplicación, a parte del password de la cuenta, se debe utilizar un usuario que se reconoce mediante un identificador.

Este puede ser un pin de 4 dígitos, una tarjeta magnética, o bien un código de Barras/QR individual.

Todas las acciones realizadas en la app quedan registradas durante 15 días para poder detectar cualquier tipo de incidencia ya sea en el uso de la aplicación o bien en la gestión del negocio.

La pantalla de identificación de usuario se muestra automáticamente al cabo de X segundos sin utilizar la aplicación (o bien al finalizar un cobro), para evitar que otro usuario lo utilice sin identificarse.

Api

Todas las peticiones a la api se autentifican, es decir, si se modifica el acceso en el backend, no se podrá seguir utilizando hasta actualizar el password en la aplicación.

Toda la comunicación de la app al servidor se realiza mediante una conexión segura con SSL, utilizando un certificado de tipo EV que garantiza la máxima seguridad posible.