Actualizado: 30 de nov de 2018
Una API (Interfaces de programación de aplicaciones) es una especificación formal sobre cómo un módulo de un software se comunica o interactúa con otro. Corresponde a un conjunto de comandos, funciones y protocolos informáticos que permiten a los desarrolladores crear programas específicos simplificando en gran medida el trabajo ya que no tienen que escribir el código desde cero.
Con las API, las aplicaciones como Facebook, Twitter, e Instagram se pueden comunicar entre ellas sin que el usuario tenga que intervenir o incluso, percatarse.
Por ejemplo, cuando el usuario compra entradas a través de la página web de una sala de cine e introduce la información de su tarjeta de crédito, la web usa una API para enviar dicha información de forma remota a otro programa que verifica si los datos bancarios son correctos. Una vez que se confirma el pago, la aplicación remota envía la información al sitio web del cine y le da un «OK», por lo que esta página emite los tickets.
Sin embargo, muchas empresas ponen en producción API’s sin realizar las comprobaciones necesarias sobre su desarrollo, lógica de negocio y/o su seguridad.
Según nuestra experiencia en servicios de Pentesting y noticias recientes, podemos asegurar que una de las vulnerabilidades más importantes a nivel de impacto recae en las API, un ejemplo claro son las últimas brechas de seguridad a empresas importantes como:
- USPS de Amazon: 60.000.000
- Facebook: 50.000.000 cuentas
- Equifax: 143.000.000 cuentas
- T-Mobile: 2.000.000 cuentas
- Instagram: 6.000.000 cuentas
- Google+: 500.000 cuentas
- Paypal Venmo: 207.984.218+ transacciones
- Under Armour: 150.000.000 cuentas
Y muchos otros como Twitter, Blizzard, SalesForce, Ticketmaster, etc.
Tanto así que OWASP TOP 10 en su versión 2017 agrego:

En Chile también tenemos casos conocidos (uno en la Banca, otro en un servicio de Correo y el ultimo en una distribuidora de materiales de construcción), pero indudablemente hay muchos otros que están expuestos y seguramente aún no se han percatado.
A continuación comparto una serie de recursos y guías de buenas prácticas para que puedan revisar más información sobre como proteger y maximizar la seguridad de sus API.
API Security Checklist:
(Estaba escribiendo el checklist y llegue a este recurso que esta muy bueno)
https://github.com/shieldfy/API-Security-Checklist
Autenticación
- No uses Basic Auth Usa autenticación estándar (e.g. JWT, OAuth).
- No reinventes la rueda en autenticación, generación de tokens, almacenamiento de contraseñas. Usa los estándares.
- Usa políticas de límite de reintentos (Max Retry) y funcionalidades de jailing en el Login.
- Usa encriptación en toda la información que sea sensible.
JWT (JSON Web Token)
- Usa claves aleatorias complejas (JWT Secret) para dificultar los ataques por fuerza bruta.
- No extraigas el algoritmo del contenido. Fuerza el algoritmo en el backend (HS256 o RS256).
- Haz que la expiración del token (TTL, RTTL) sea tan corta como sea posible.
- No almacenes información sensible en el contenido del JWT, puede ser descodificado fácilmente.
OAuth
- Siempre valida redirect_uri en el lado del servidor para permitir sólo ciertas URLs.
- Trata siempre de intercambiar código y no tokens (no permitas response_type=token).
- Usa el parámetro state con un hash aleatorio para prevenir CSRF en el proceso de autenticación OAuth.
- Define el ámbito (scope) por defecto, y valida los parámetros de ámbito para cada aplicación.
Acceso
- Limita las peticiones (Throttling) para prevenir ataques DDoS y de fuerza bruta.
- Usa HTTPS en el lado del servidor para evitar ataques MITM (Man In The Middle Attack).
- Usa la cabecera HSTS con SSL para evitar SSL Strip attack.
Entradas
- Usa el método HTTP apropiado a cada operación: GET (lectura), POST (creación), PUT/PATCH (reemplazo/actualización), y DELETE (borrado), y responde con 405 Method Not Allowed si el método en la petición no es apropiado para el recurso.
- Valida el content-type en la cabecera Accept de las peticiones (Content Negotiation), para permitir sólo los formatos soportados (e.g. application/xml, application/json, etc) y responde con 406 Not Acceptable si no hay coincidencias.
- Valida el content-type de información enviada en base a la que aceptes (e.g. application/x-www-form-urlencoded, multipart/form-data, application/json, etc).
- Valida las entradas que realizan los usuarios para evitar ataques comunes (e.g. XSS, SQL-Injection, Remote Code Execution, etc).
- No utilices información sensible (credentials, Passwords, security tokens, or API keys) en la URL, en su lugar usa la cabecera estándar Authorization.
- Usa un servicio de API Gateway para permitir almacenamiento en caché (caching), límite de peticiones (Rate Limit), Spike Arrest y el despliegue de APIs dinámicamente.
Procesamiento
- Valida que todos los endpoints estén protegidos con autenticación para evitar romper el proceso de autenticación.
- Debes evitar los recursos bajo un ID de usuario. Usa /me/orders en lugar de /user/654321/orders.
- No uses IDs auto incrementales. Usa UUID en su lugar.
- Si estas procesando archivos XML, asegúrate de deshabilitar el procesamiento de entidades para evitar ataques XXE (XML external entity attack).
- Si estas procesando archivos XML, asegúrate de deshabilitar la expansión de entidades, para evitar un ataque Billion Laughs/XML bomb via expansión exponencial de entidades.
- Utiliza CDN para subidas de ficheros.
- Si lidias con grandes cantidades de información, utiliza Workers y Colas para procesar tanto cómo sea posible en segundo plano, y devuelve una respuesta rápido para evitar un bloqueo HTTP.
- No olvides deshabilitar el modo Debug.
Salidas
- Envía la cabecera X-Content-Type-Options: nosniff.
- Envía la cabecera X-Frame-Options: deny.
- Envía la cabecera Content-Security-Policy: default-src ‘none’.
- Elimina cabeceras que dejen huellas – X-Powered-By, Server, X-AspNet-Version etc.
- Fuerza content-type para tus respuestas, si devuelves un json entonces tu content-type es application/json.
- No devuelvas información sensible cómo credenciales, contraseñas, tokens de seguridad.
- Devuelve el código HTTP acorde a la operación completada. (e.g. 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, etc).
CI & CD
- Audita tu diseño e implementación con tests unitarios/integración y test coverage.
- Usa procesos de revisión de código y evita la auto aprobación.
- Asegura que todos los componentes de tus servicios se escanean estáticamente con un software AV antes de ir a producción, incluyendo librerías de terceros y dependencias.
- Diseña un proceso de rollback para tus deploys.
Buenas Practicas:
- https://techbeacon.com/8-essential-best-practices-api-security
- https://www.twistlock.com/2018/06/04/7-api-best-practices/
- https://dzone.com/refcardz/rest-api-security-1?chapter=1
- https://blog.runscope.com/posts/best-practices-api-security-common-vulnerabilities
Y algo muy importante que no aparece en ninguno de los links más arriba….
«HAGAN ETHICAL HACKING».
Saludos.
Germán.