Seguridad y confianza
Vas a ejecutar nuestro script en servidores de producción. Esto es exactamente lo que hace.
El escáner lee; no escribe ni se conecta a nada. El informe corre en tu navegador. El único servidor que operamos ve una referencia de pago de Stripe, nunca datos del escaneo.
Qué lee el escáner
Son dos scripts, uno por plataforma, cada uno en un solo archivo legible con licencia MIT: runtimeclear.sh para Linux y macOS (bash 3.2+) y runtimeclear.ps1 para Windows (PowerShell 5.1+). Cada uno empieza con un encabezado que enumera todo lo que lee.
| Plataforma | Dónde busca instalaciones de Java |
|---|---|
| Linux | Bases de datos de paquetes (rpm, dpkg, con el proveedor del paquete), /usr/lib/jvm, /usr/java, /opt (4 niveles), /usr/local (3 niveles), update-alternatives |
| macOS | /Library/Java/JavaVirtualMachines y su equivalente de usuario, el plug-in heredado del navegador, /usr/libexec/java_home -V, fórmulas openjdk* y casks de JDK de Homebrew, el LaunchAgent del actualizador de Java de Oracle |
| Windows | HKLM\SOFTWARE\JavaSoft (y WOW6432Node), claves de desinstalación del registro, carpetas habituales de proveedores en Program Files, where.exe java, scoop, valores de política de Java Update, jusched.exe y tareas programadas con nombres tipo Java Update |
| Todas | java en PATH, JAVA_HOME, SDKMAN, jenv, asdf, carpetas de JDK de Gradle y Maven, ~/.jdks de IntelliJ, procesos java en ejecución (solo la ruta del ejecutable) |
De cada instalación lee el archivo de texto release (JAVA_VERSION, JAVA_RUNTIME_VERSION, IMPLEMENTOR, BUILD_TYPE). Solo si una instalación no tiene archivo release ejecuta <home>/bin/java -version, con un límite de 5 segundos; --no-exec (-NoExec) lo desactiva.
Con --repo lee Dockerfiles, YAML de Compose y Kubernetes, archivos de CI, .sdkmanrc, .tool-versions y archivos de Gradle y Maven línea por línea, se salta binarios y archivos de más de 1 MB, y guarda solo la línea que coincide, recortada a 300 caracteres. La lista completa de patrones está en el README del escáner (en inglés).
Lo que nunca hace
- Sin acceso a la red. Los scripts nunca abren un socket. Las pruebas del escáner ejecutan un escaneo completo bajo
stracey fallan si se abre cualquier socketAF_INEToAF_INET6. El script de PowerShell evitaGet-Packageporque ese cmdlet puede intentar descargar un proveedor. - Sin cambios. No instala, actualiza, mueve ni borra nada. El único archivo que escribe es el JSON de salida.
- Sin datos de más. Ni argumentos de procesos, ni variables de entorno aparte de
PATHyJAVA_HOME, ni contenido de archivos más allá de una línea coincidente. - No requiere sudo. Las ubicaciones que no puede leer aparecen en
warningsdentro del JSON. Ejecutarlo como root o administrador solo agrega los directorios y procesos de otros usuarios.
Revisa el JSON antes de compartirlo
--anonymize reemplaza el nombre del host por los primeros 12 caracteres hexadecimales de su SHA-256. Las rutas como /home/ana/.sdkman/… y los nombres de carpetas de repositorios siguen en el archivo. Es texto plano: léelo.
Verifica la descarga
Cada release en GitHub incluye runtimeclear.sh, runtimeclear.ps1 y un archivo SHA256SUMS generado a partir de esos mismos archivos. Comprueba el hash, lee el script y después ejecútalo.
$ curl -fsSLO https://github.com/techbuilddreams/runtimeclear/releases/download/v1.0.1/runtimeclear.sh $ curl -fsSLO https://github.com/techbuilddreams/runtimeclear/releases/download/v1.0.1/SHA256SUMS $ sha256sum -c SHA256SUMS --ignore-missing # macOS: shasum -a 256 runtimeclear.sh y compara con SHA256SUMS
PS> Invoke-WebRequest https://github.com/techbuilddreams/runtimeclear/releases/download/v1.0.1/runtimeclear.ps1 -OutFile runtimeclear.ps1 PS> (Get-FileHash .\runtimeclear.ps1 -Algorithm SHA256).Hash.ToLower() # compara con la línea de runtimeclear.ps1 en SHA256SUMS
Atestaciones de procedencia
El flujo de publicación está pasando a GitHub Actions con atestaciones firmadas de procedencia, que vinculan cada archivo publicado con la ejecución y el commit que lo produjeron. Los releases hasta v1.0.1 se publicaron antes de ese cambio y solo incluyen checksums. Cuando un release incluya atestaciones, sus notas lo dirán.
Cómo maneja el informe tus archivos
- La página del informe lee los archivos con la File API del navegador y los clasifica en tu computadora con
rules.js, un archivo de reglas versionado que puedes leer. - Para que los escaneos cargados sobrevivan al paso por el checkout, se guardan en el
sessionStoragede la pestaña, que el navegador borra al cerrarla. Clear all los elimina de inmediato. - El nombre de la organización y el número de empleados que escribes se guardan en
localStorage, en tu computadora. - La Content Security Policy del sitio limita la página a su propio origen (
connect-src 'self'), así que la página no puede enviar datos a terceros. Puedes comprobarlo en el panel de red del navegador: cargar escaneos no genera solicitudes.
Cómo se verifica el pago
- Pagas en el checkout alojado por Stripe. Nunca vemos los datos de tu tarjeta.
- Stripe te redirige a
/report/?session_id=cs_…. - La página envía solo ese ID de sesión a
/api/verify.php. - El servidor consulta esa sesión en la API de Stripe con una clave restringida que solo puede leer Checkout Sessions, y comprueba que esté completa y pagada, sea reciente y corresponda a un precio de RuntimeClear.
- Devuelve un token de desbloqueo con tu plan, el ID de sesión y una fecha de expiración, firmado con HMAC-SHA256. El navegador lo guarda en
localStorage. - En visitas posteriores la página envía solo el token; el servidor verifica la firma y la expiración sin llamar a Stripe.
El endpoint solo acepta POST JSON del mismo origen, limita la frecuencia de solicitudes con un hash de un solo sentido de la IP del cliente (unas 30 solicitudes cada 10 minutos), nunca registra la respuesta de Stripe ni la clave, y lee sus secretos de un archivo fuera de la raíz web.
Datos que conservamos
- Archivos de escaneo
- Ninguno. Nunca llegan a nuestro servidor.
- Pagos
- Los registros de Stripe de tu compra: nombre, correo, plan, monto, fecha, país y estado del pago.
- Logs del servidor
- Los logs estándar del servidor web de nuestro proveedor de hosting (IP, hora, URL, referer, user agent) y un contador temporal de límite de solicitudes asociado a una IP en hash.
- Correo
- Los mensajes que envías a support@runtimeclear.com, que conservamos para responderte y gestionar reembolsos o accesos.
- Analítica, anuncios, cookies
- Ninguno.
Los detalles completos están en la política de privacidad (en inglés).
Protección del sitio web
- Solo HTTPS, con
X-Content-Type-Options,X-Frame-Options: DENY, unaReferrer-Policyestricta,Permissions-PolicyyCross-Origin-Opener-Policy. - Content Security Policy
default-src 'self', sin scripts en línea y sin scripts, estilos ni fuentes de terceros. Las fuentes se sirven desde el propio sitio. - El único destino de terceros es Stripe Checkout, al que llegas con un enlace normal cuando decides comprar.
Reportar una vulnerabilidad
Escribe a support@runtimeclear.com con los pasos para reproducirla. Por favor, no abras un issue público sobre algo que pueda aprovecharse antes de que exista una corrección. En el escáner consideramos falla de seguridad cualquiera de estas: una conexión de red de cualquier tipo, escribir en un archivo distinto del JSON de salida, ejecutar algo que no sea <java home>/bin/java -version, registrar datos que decimos que no se recopilan, o una salida que deja de ser JSON válido por una ruta manipulada.
Buscamos confirmar la recepción en un día hábil y damos crédito a quien reporta en las notas del release, salvo que prefieras que no. Contacto legible por máquinas: /.well-known/security.txt. Las fallas no sensibles del escáner pueden ir a los issues de GitHub.