Cómo verificar que Comoji nunca envía tus pulsaciones a ningún sitio
Comoji añade autocompletado :emoji: gratuito al estilo de Slack a todas las apps de tu Mac.
Comoji pide Accesibilidad y Monitorización de entrada, los dos permisos más invasivos de macOS. Decimos que todo se procesa localmente y que nada de lo que escribes se sube nunca. Alguien en Reddit planteó bien la objeción evidente: más o menos nos creía, pero aun así se le hacía raro conceder esos permisos sin más garantía que nuestra palabra.
Es una objeción justa, y la respuesta no debería ser «confía más en nosotros». Este artículo es la guía práctica: todos los comandos de abajo son de solo lectura, llevan unos cinco minutos y te permiten confirmar en tu propia máquina lo que Comoji hace y no hace en la red. La versión de referencia de todo esto, incluida la lista completa de hosts, está en la página de seguridad.
Qué estás comprobando en realidad
Un keylogger tiene que hacer algo con lo que captura. Lo envía a algún sitio o lo escribe en algún sitio. Es una afirmación pequeña y concreta de comprobar, y macOS trae las herramientas para hacerlo: puedes listar todos los sockets de red que tiene abiertos un proceso, contar cada byte que ha enviado, leer los nombres de host incrustados en el binario con el que se distribuyó y bloquear por completo su acceso a la red para ver qué deja de funcionar.
Nada de esto es específico de Comoji. Usa exactamente los mismos pasos con cualquier app de Mac que pida estos permisos, incluida la nuestra. De eso se trata.
Antes de empezar
Ten Comoji en ejecución y abre Terminal (Applications → Utilities → Terminal). Todos los comandos de abajo son inspecciones de solo lectura: nada instala, cambia ni borra nada. Si instalaste una versión de desarrollo, el proceso se llama ComojiDev y deberías sustituirlo en todos los lugares donde aparece Comoji.
Primero, confirma que está en ejecución y obtén su ID de proceso:
pgrep -x ComojiDeberías obtener un número. Si no obtienes nada, Comoji no está en ejecución (es una app de la barra de menús, así que búscala en la barra de menús y no en el Dock).
Paso 1: observa sus conexiones de red mientras escribes
lsof lista los archivos abiertos, y en un sistema Unix un socket de red es un archivo. Limitado al ID de proceso de Comoji, muestra todas las conexiones que la app tiene abiertas en este momento:
lsof -nP -i -a -p "$(pgrep -x Comoji)"El resultado esperado es ninguna salida en absoluto. Una respuesta vacía significa que el proceso no tiene ninguna conexión de red. Ahora ponte a escribir: abre Mensajes, lanza unos cuantos :fire, :tada y :liz, escribe un párrafo o dos y vuelve a ejecutar el comando. Sigue vacío.
Una sola captura podría, en principio, perderse una conexión que se abre y se cierra entre comprobaciones, así que mejor obsérvalo de forma continua. Pega esto en otra ventana de Terminal y déjalo en marcha mientras usas tu Mac con normalidad:
while :; do
printf '%s ' "$(date +%T)"
lsof -nP -i -a -p "$(pgrep -x Comoji)" | tail -n +2 | awk '{print $9}' | paste -sd' ' -
echo
sleep 2
doneObtienes una marca de tiempo cada dos segundos sin nada detrás, escribas lo que escribas. Pulsa Control-C para detenerlo.
Luego, con ese bucle todavía en marcha, haz algo que *sí* debe usar la red: escribe /gif en Mensajes y busca algo. Ahora verás aparecer api.giphy.com y un host de la CDN de giphy.com junto a las marcas de tiempo. Ese contraste es lo útil de esta prueba. Demuestra que el bucle te habría mostrado una conexión si la hubiera habido, así que las líneas vacías mientras escribías significan lo que parecen significar.
Paso 2: cuenta los bytes
nettop registra el tráfico acumulado por proceso, así que detecta cualquier cosa demasiado breve para una comprobación por muestreo:
nettop -P -p "$(pgrep -x Comoji)"Déjalo abierto, escribe unos minutos y no toques los selectores /gif y /sticker. Las columnas bytes_in y bytes_out se quedan en cero. Pulsa q para salir.
Paso 3: lee los nombres de host de la app que descargaste
Un proceso solo puede conectarse a un sitio que conoce, y los nombres de host tienen que estar guardados en el binario. strings extrae el texto legible de un archivo compilado, así que puedes listarlos sin ningún código fuente:
strings -a /Applications/Comoji.app/Contents/MacOS/Comoji \
| grep -Eo 'https?://[A-Za-z0-9._-]+' | sort -u
/usr/libexec/PlistBuddy -c 'Print :SUFeedURL' \
/Applications/Comoji.app/Contents/Info.plistLo que aparece es la CDN de ilustraciones de stickers de Google (fonts.gstatic.com), el canal de actualizaciones en Firebase Storage (storage.googleapis.com) y un puñado de direcciones de comoji.io y de otros proyectos que solo se pasan a tu navegador cuando haces clic en un enlace dentro de la app.
Dos advertencias honestas, para que esto coincida con lo que ves de verdad y no con una versión maquillada. api.giphy.com se construye en el código a partir de su nombre de host en lugar de guardarse como URL completa, así que no aparecerá en esa primera lista; búscalo directamente con strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com', un patrón que solo coincide con nombres de host, así que no mostrará la clave de API que también se incluye en el paquete. Y el framework de actualizaciones Sparkle incluido trae sus propias URL de documentación (sparkle-project.org, andymatuschak.org) dentro de Contents/Frameworks, que son cadenas de una biblioteca de terceros y no hosts con los que Comoji se comunique.
Paso 4: bloquéala y mira qué deja de funcionar
Esta es la prueba más sólida, porque no depende de fiarte de ninguna salida. Instala un cortafuegos de salida: LuLu es gratuito y de código abierto, y Little Snitch es la opción comercial veterana. Configúralo para que avise de cada conexión saliente y luego deniega todo lo que venga de Comoji, de forma permanente.
El autocompletado de emoji sigue funcionando exactamente igual, indefinidamente, porque nunca necesitó la red. Lo único que deja de funcionar es la búsqueda de actualizaciones y la descarga de ilustraciones de stickers o GIF que no tengas ya en caché. Si la afirmación de que todo es local fuera falsa, aquí es donde se vendría abajo, y con estruendo.
Paso 5: confirma que la app es realmente nuestra
Todo lo anterior pone a prueba la copia que tienes en el disco. Vale la pena confirmar que esa copia es la que Apple notarizó y que nadie la ha modificado desde entonces:
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.appcodesign muestra el Developer ID con el que está firmada la app, spctl debería responder accepted con source=Notarized Developer ID, y el volcado de entitlements muestra lo que la app tiene permitido hacer, sin más.
Lo que hacemos por nuestra parte
Una verificación que puedes hacer tú vale más que una promesa, pero la promesa también debería estar garantizada en algún sitio. Dos cosas se ejecutan en cada compilación de la app:
- La lista completa de hosts con los que Comoji puede comunicarse es una declaración en el código fuente, publicada como la superficie de red y visible en la app en Preferencias → Privacidad. Una prueba automática hace fallar la compilación si la app puede llegar a un host que esa lista no declara.
- Una segunda prueba analiza el código que realmente maneja las pulsaciones (el event tap, el búfer de tokens, el buscador de coincidencias y el insertador) y hace fallar la compilación si aparece en él cualquier API de red o cualquier URL remota. La parte de Comoji que ve lo que escribes no contiene nada de red, y no puede adquirirlo a escondidas.
Esa misma página también recoge lo que hemos decidido *no* hacer y por qué, incluido publicar como código abierto la ruta de entrada y encargar una revisión de pago a terceros, para que puedas valorar el razonamiento en lugar de adivinarlo.
Si ejecutas algo de esto y encuentras algo que contradiga lo que publicamos, escribe a support@comoji.io. Preferimos corregir la página o la app antes que dejar que la afirmación sea falsa sin que nadie lo note.
Sobre lo que la app hace realmente con esos permisos, la página de funciones cubre todas las apps y sitios en los que funciona Comoji y las listas para desactivarla por app y por sitio web que la mantienen en silencio donde prefieras que no se ejecute en absoluto.
Preguntas frecuentes
¿Cómo puedo saber si una app de Mac está enviando mis pulsaciones a algún sitio?
Ejecuta lsof -nP -i -a -p "$(pgrep -x AppName)" en Terminal para listar las conexiones de red que la app tiene abiertas en ese momento, y nettop -P -p "$(pgrep -x AppName)" para ver los bytes acumulados enviados y recibidos. Para una prueba definitiva, instala un cortafuegos de salida como LuLu o Little Snitch, bloquea la app por completo y comprueba si sus funciones siguen funcionando.
¿Comoji sube lo que escribo?
No. Comoji no tiene cuenta, ni telemetría, ni analíticas, ni informes de fallos. Las pulsaciones se guardan en un búfer en memoria de corta duración solo para detectar un atajo que empieza por dos puntos, y nunca se escriben en disco ni se transmiten. La app se comunica exactamente con cuatro hosts: el canal de actualizaciones, la CDN de ilustraciones de stickers de Google, y la API y la CDN de GIPHY cuando usas el selector /gif.
¿Por qué Comoji necesita Accesibilidad y Monitorización de entrada?
Monitorización de entrada le permite notar cuándo escribes un atajo como :fire. Accesibilidad le permite encontrar el campo de texto con el foco y la posición del cursor para que la ventana de sugerencias aparezca en el lugar correcto, y escribir el emoji en ese campo. Ninguno de los dos se usa para leer el contenido de tus campos de texto, y los campos de contraseña seguros se ignoran por completo.
¿Comoji es de código abierto?
Por ahora no. La página de seguridad de comoji.io recoge esa decisión junto con el razonamiento, publica la superficie de red completa y ofrece comandos paso a paso para verificar la afirmación de procesamiento local con el binario notarizado que descargaste.
Descarga Comoji gratis para Mac
Autocompletado de :emoji: al estilo de Slack y Discord, en todo tu Mac. Gratis.