Protocolo SSL/TLS y Conectividad Segura en FenixIRC
Guía técnica integral sobre validación de certificados X.509, autenticación SASL en túnel aislado, prevención activa de ataques Man-in-the-Middle y mitigación de degradación criptográfica en redes no confiables.
Arquitectura de Configuración y Mapeo de Parámetros
Cada instancia de servidor en FenixIRC persiste mediante la entidad reactiva ServerEntity.kt, administrada con StateFlow por ServersViewModel.kt y renderizada en Compose a través de ServerEditScreen.kt.
| Parámetro UI | Propiedad Kotlin | Valor / Por Defecto | Implicación TLS |
|---|---|---|---|
| Nombre de Red | name: String | "Libera.Chat" | Identificador en logs y session storage |
| Servidor / Host | host: String | irc.libera.chat | Sujeto a validación SAN en handshake X.509 |
| Puerto Seguro | port: Int | 6697 (SSL) vs 6667 | Conexión SSL implícita instantánea |
| Usar SSL/TLS | useSsl: Boolean | true (Activado) | Despacha SSLSocketFactory directo |
| Texto Plano | allowPlainText: Boolean | false (Restringido) | Previene degradación accidental a puerto 6667 |
| Autenticación SASL | useSasl: Boolean | PLAIN sobre túnel TLS | Aislado criptográficamente pre-registro |
| Bouncer Proxy | useBouncer: Boolean | ZNC / SOJU Support | Túnel SSL hacia el bouncer intermedio |
| Codificación | encoding: String | UTF-8 | Evita colisiones de decoding en bytes cifrados |
Cuando useSsl = true, el motor FenixIRC invalida cualquier fallback a texto claro. Si el servidor remoto rechaza el socket seguro o falla el certificado, la conexión finaliza con SSLHandshakeException sin transmitir nicks ni tokens.
Flujo de Negocio y Mapeo en el ViewModel (ServersViewModel.kt)
Cuando el usuario confirma los parámetros en la UI, el ViewModel orquesta una transición asíncrona respaldada por Kotlin Coroutines, actualiza la base de datos local SQLite/Room y emite un comando de conexión al actor de red singleton.
Escritura ACID de ServerEntity
Emisión StateFlow a sesión activa
Túnel seguro en puerto 6697
fun connectServer(server: ServerEntity) {
viewModelScope.launch(Dispatchers.IO) {
// 1. Persistir cambios de estado y última conexión en Room
serverDao.updateServer(server.copy(lastConnected = System.currentTimeMillis()))
// 2. Transformar entidad Room en modelo de ejecución IrcConfig
val config = IrcConfig(
networkId = server.id,
host = server.host,
port = if (server.useSsl) 6697 else server.port,
useSsl = server.useSsl,
allowPlainText = server.allowPlainText && !server.useSsl,
saslCredentials = if (server.useSasl) SaslAuth(server.saslUser, server.saslPass) else null,
bouncerSettings = if (server.useBouncer) BouncerNetwork(server.bouncerNetwork) else null,
charset = Charset.forName(server.encoding)
)
// 3. Despachar al motor singleton IrcManager para levantar el socket
IrcManager.getInstance().initiateConnection(config)
}
}
Protocolo de Conexión SSL/TLS en Puerto 6697
FenixIRC implementa TLS Implícito sobre el puerto estándar 6697 en lugar del comando diferido STARTTLS. Esto garantiza que la negociación criptográfica se complete de forma atómica antes de intercambiar cualquier byte del protocolo IRC.
El Three-Way Handshake TCP es sucedido al instante por el TLS Client Hello. No existe ventana temporal de texto plano susceptible a ataques de intercepción RST o inyecciones de payloads intermedios.
Cero Exposición de Tráfico
Comandos fundacionales como CAP LS 302, PASS, NICK y AUTHENTICATE PLAIN viajan encapsulados dentro de tramas AES-GCM ya cifradas.
private fun createSecureSocket(config: IrcConfig): Socket {
return if (config.useSsl) {
val sslFactory = SSLSocketFactory.getDefault() as SSLSocketFactory
(sslFactory.createSocket() as SSLSocket).apply {
// Habilitar exclusivamente TLSv1.2 y TLSv1.3
enabledProtocols = arrayOf("TLSv1.3", "TLSv1.2")
// Optimización de latencia y persistencia de paquetes
tcpNoDelay = true
keepAlive = true
soTimeout = 15_000 // 15 segundos timeout de handshake y lectura
// Conectar y activar verificación estricta de Subject Alternative Name (SAN)
connect(InetSocketAddress(config.host, config.port), 15_000)
startHandshake()
}
} else {
if (!config.allowPlainText) throw SecurityException("Plaintext connection strictly blocked")
Socket().apply { connect(InetSocketAddress(config.host, config.port), 15_000) }
}
}
Validación de Certificados TLS y Rechazo de Conexiones No Seguras
FenixIRC rechaza rotundamente implementaciones vulnerables de TrustAllCertificates o bypasses de verificación de nombres. Se delega la validación de certificados al proveedor de seguridad del sistema operativo Android (TrustManagerFactory).
El certificado del servidor debe derivar de una Autoridad Certificadora (CA) raíz preinstalada y auditada en el almacén oficial del sistema Android.
El campo Subject Alternative Name (SAN) del certificado X.509 debe coincidir de forma unívoca con el FQDN configurado en el campo server.host.
El instante Unix actual debe situarse taxativamente dentro del rango NotBefore y NotAfter estipulado por el emisor.
Si el servidor remoto presenta un certificado autofirmado no registrado, un certificado caducado o un Subject CN divergente, FenixIRC aborta inmediatamente el hilo de ejecución socket y notifica en la consola de sesión:
[ERROR] Connection Failure: javax.net.ssl.SSLHandshakeException: Trust anchor for certification path not found / Domain mismatch (expected irc.libera.chat, found rogue.spoofed-server.net)
Matriz de Mitigación de Ataques Man-in-the-Middle (MitM)
Comparativa directa entre el comportamiento de clientes IRC heredados sobre redes inseguras (Wi-Fi públicas, proxies maliciosos) y la postura criptográfica nativa de FenixIRC.
| Vector de Ataque | IRC Tradicional (Puerto 6667) | Protección FenixIRC (TLS 1.3 / 6697) |
|---|---|---|
| Eavesdropping Escucha pasiva de paquetes de red | Mensajes, canales privados y nicks legibles en texto plano mediante tcpdump o Wireshark. | Payloads completamente cifrados con AES-256-GCM o ChaCha20-Poly1305. Secreto perfecto hacia adelante (PFS). |
| Robo de Credenciales NickServ / Operador / SASL |
Comandos /msg NickServ IDENTIFY pass transmitidos sin codificar en el router intermedio.
|
Autenticación SASL PLAIN / ECDSA ejecutada exclusivamente dentro del túnel TLS establecido y validado. |
| Inyección Activa de Mensajes Spoofing de comandos /KICK o /BAN | Posibilidad de inyectar comandos simulados del servidor mediante secuencias TCP desincronizadas. | Autenticidad e integridad garantizadas por Message Authentication Codes (MAC / AEAD). Tramas alteradas son descartadas. |
| Ataques de Degradación STARTTLS Stripping | El atacante bloquea el comando STARTTLS forzando al cliente a dialogar en texto plano. | Inmune por diseño: FenixIRC no ofrece STARTTLS desprotegido. El socket es TLS nativo desde el byte inicial. |
Guía Paso a Paso: Configurar una Red Segura en FenixIRC
Sigue estos cinco pasos elementales dentro de la interfaz gráfica de FenixIRC para conectar cualquier red federada bajo máximas garantías criptográficas.
Toca el botón flotante + o mantén presionado un servidor existente en la lista principal.
Ingresa el dominio FQDN (ej. irc.libera.chat) y fija el puerto en 6697.
Conmuta el interruptor Usar SSL/TLS a encendido. La casilla de texto plano se ocultará automáticamente.
Si posees cuenta registrada, activa Autenticación SASL con tu cuenta y token NickServ.
Presiona Guardar y toca sobre el servidor para iniciar la negociación del túnel en milisegundos.