top of page

Manténgase alerta: ataques dirigidos contra Rustaceans destacados

hace 4 horas
15 min de lectura

Los equipos de seguridad de Rust emitieron una contundente advertencia el 17 de septiembre, después de que al menos una campaña dirigida evolucionara de videollamadas convincentes a publicaciones maliciosas de crates. Manténgase alerta: ataques dirigidos contra Rustaceans destacados no es un recordatorio genérico sobre phishing. Los atacantes se están acercando a miembros de proyectos Rust y propietarios de crates populares porque un único mantenedor comprometido puede exponer miles de entornos de desarrollo posteriores.

La campaña disfraza su primer contacto como una oferta de empleo, un proyecto de consultoría, una conversación de inversión o una oportunidad contractual. Durante o después de una videollamada, el objetivo se encuentra con un supuesto problema técnico. La solución propuesta implica instalar un códec de audio, ejecutar un comando o abrir un proyecto controlado por el atacante.

Ese enfoque de ingeniería social parece haber tenido éxito antes. El 20 de agosto, los atacantes publicaron versiones maliciosas de arrayref, internment y append-only-vec mediante una cuenta de mantenedor comprometida. Su código se ejecutaba durante la compilación, convirtiendo una actualización de dependencia ordinaria en una vía hacia estaciones de trabajo de desarrolladores y sistemas de integración continua.

El conflicto central ya no es simplemente código fiable frente a código malicioso. Es confianza personal frente a autoridad sobre paquetes. Las personas que reciben estas llamadas tienen derechos de publicación que pueden transformar un compromiso privado en un incidente de cadena de suministro de software.

Manténgase alerta: los ataques dirigidos contra Rustaceans destacados se han convertido en una advertencia sobre la cadena de suministro

El proyecto Rust está advirtiendo a los mantenedores porque cree que los atacantes buscan acceso de publicación, no solo archivos o contraseñas individuales.

Adam Harvey publicó la advertencia sobre ataques dirigidos para el equipo de crates.io y el grupo de trabajo de respuesta de seguridad de Rust. Los equipos creen que una campaña en curso está apuntando a miembros de rust-lang y propietarios de crates populares.

El objetivo sospechado es comprometer dispositivos y cuentas, y después usar ese acceso para publicar malware. Esa evaluación conecta la ingeniería social privada con un mecanismo de distribución pública. La estación de trabajo de un desarrollador, la sesión de su navegador, su cuenta de correo electrónico o sus credenciales de crates.io pueden convertirse en el puente entre ambos.

El enfoque reportado comienza con una oportunidad positiva. Un desconocido propone un empleo, proyecto, función de asesoría, conversación de inversión o contrato. La invitación está lo bastante personalizada como para merecer una respuesta, y la persona que llama puede respaldar la historia con un perfil de aspecto profesional.

Según se informa, los atacantes han creado identidades empresariales y presencias en LinkedIn plausibles. Estos recursos no necesitan resistir una diligencia debida seria. Solo tienen que parecer creíbles durante el breve período entre un mensaje no solicitado y una llamada programada.

Luego, la llamada crea un obstáculo artificial. Supuestamente falla el audio, parece faltar un códec o se requiere un comando para restaurar el acceso. Otra variante coloca un comando en el portapapeles e indica al objetivo que lo pegue en una terminal.

Ese momento importa porque redefine la ejecución de código como resolución de problemas. El objetivo no instala conscientemente un programa desconocido. Cree que está resolviendo un problema de comunicación habitual mientras otra persona espera en pantalla.

La advertencia de Rust pide a los destinatarios tratar los contactos en frío con mayor sospecha y utilizar plataformas en las que ya confían. Recomienda que el objetivo cree la reunión siempre que sea posible. Eso elimina al menos un componente controlado por el atacante de la interacción.

También se pide a los mantenedores que revisen sus cuentas en busca de actividad inesperada y confirmen que la autenticación multifactor está activada. Quienes estén preocupados por el acceso a crates.io pueden contactar con su dirección de soporte, mientras que los incidentes más amplios pueden comunicarse al equipo de seguridad de Rust.

Estas recomendaciones son deliberadamente sencillas. La parte peligrosa de esta campaña no es una vulnerabilidad oscura de Rust. Es una interacción humana creíble seguida de una acción ordinaria con consecuencias ocultas.

La advertencia no afirma que todos los incidentes reportados pertenezcan a un mismo operador. Los equipos de Rust dicen explícitamente que aún no saben si los intentos de junio, el compromiso de arrayref y la actividad actual constituyen una sola campaña. Esa incertidumbre debe limitar la atribución, pero no reduce el riesgo inmediato.

Por eso Manténgase alerta: ataques dirigidos contra Rustaceans destacados tiene más peso de lo que su redacción mesurada sugiere. La advertencia sigue a un compromiso de publicación real, no a un modelo de amenaza hipotético.

El incidente de arrayref mostró lo que puede desbloquear un mantenedor comprometido

El ataque contra arrayref convirtió el control de una cuenta legítima de mantenedor en publicaciones maliciosas en tres paquetes consolidados.

A las 7:15 UTC del 20 de agosto, el Equipo de Respuesta de Seguridad de Rust recibió un informe de que proc-macro1 era malicioso. Los investigadores confirmaron que su script de compilación descargaba una carga útil remota.

Un script de compilación es código que Cargo, el gestor de paquetes y sistema de compilación de Rust, ejecuta mientras compila un paquete. Puede realizar tareas legítimas de configuración, pero se ejecuta antes de que una aplicación se inicie. Eso lo convierte en un lugar atractivo para ocultar malware.

El equipo descubrió que una nueva versión de arrayref dependía directamente de proc-macro1. También se habían retirado versiones limpias recientes, lo que podía orientar la resolución de dependencias hacia la versión maliciosa. El atacante repitió el patrón con internment y append-only-vec, dos crates controlados por la misma cuenta de mantenedor.

El aviso oficial del incidente de arrayref identificó tres publicaciones contaminadas. arrayref 0.3.10 permaneció disponible durante 86 minutos, internment 0.8.7 durante 90 minutos y append-only-vec 0.1.9 durante 107 minutos.

Esas ventanas parecen breves en un calendario. Son lo bastante largas para que la resolución automatizada de dependencias, las compilaciones de desarrolladores, las herramientas de edición y los trabajos de integración continua recuperen paquetes nuevos.

El equipo de Rust eliminó las versiones maliciosas y seis crates relacionados. Restauró versiones limpias que el atacante había retirado y bloqueó la cuenta de mantenedor afectada. El equipo de respuesta dijo que no creía que el autor legítimo hubiera actuado de forma maliciosa.

En cambio, el equipo evaluó que probablemente se habían comprometido el equipo o las credenciales del autor. Esa distinción importa porque muestra los límites de la reputación. Un paquete conocido puede contener código controlado por un atacante sin que su mantenedor reconocido haya decidido añadirlo.

Los investigadores de seguridad estimaron que arrayref acumulaba unos 245 millones de descargas históricas. internment tenía aproximadamente 14,4 millones, mientras que append-only-vec rondaba los 4,5 millones. Los totales históricos no equivalen a instalaciones afectadas, pero muestran por qué importa la selección de cuentas.

Los atacantes no necesitaban sembrar un paquete desconocido y esperar a que fuera adoptado. Colocaron una dependencia maliciosa detrás de proyectos que los desarrolladores ya aceptaban. Por lo demás, los paquetes principales contaminados parecían conocidos.

Los crates también desempeñaban funciones técnicas distintas. arrayref proporciona macros para obtener referencias a arrays de tamaño fijo a partir de slices. internment permite el internamiento, que almacena una copia compartida de valores repetidos. append-only-vec proporciona un vector concurrente cuyas entradas existentes no se eliminan.

Ninguna de esas funciones sugiere de forma natural la descarga de un ejecutable remoto. Esa discrepancia solo se hizo visible al examinar la nueva dependencia y su comportamiento durante la compilación.

Por tanto, el incidente cambió el contexto de cada oportunidad falsa posterior. Una consulta laboral dirigida a un mantenedor de alto impacto ya no puede evaluarse únicamente como spam personal. Puede representar el movimiento inicial de otro ataque contra la cadena de suministro de Rust.

Una estafa de entrevista falsa convierte la cortesía profesional en ejecución

Los atacantes explotan la disposición de un mantenedor a evaluar una oportunidad y luego organizan la interacción para que la cooperación normal ejecute su código.

La parte más peligrosa de esta campaña ocurre antes de que el malware llegue a crates.io. Empieza con la investigación sobre el objetivo. La propiedad de paquetes, las membresías en proyectos, las apariciones en conferencias y los intereses profesionales suelen ser públicos.

Esa información ayuda a un atacante a crear una oferta relevante. Un mensaje genérico de un reclutador puede ignorarse. Una propuesta que haga referencia al trabajo del mantenedor puede conseguir una conversación, especialmente si cuenta con el respaldo de un sitio web empresarial y un perfil social plausibles.

Un incidente de junio documentado por el desarrollador de Rust Matt Mastracci ilustra la preparación implicada. Un supuesto representante de inversiones se acercó a él para hablar de trabajo de asesoría, programó una videoconversación y más tarde envió un ejercicio técnico.

El repositorio proporcionado parecía contener un proyecto TypeScript ordinario. Sus instrucciones pedían al destinatario ejecutar comprobaciones de tipos, pruebas y compilaciones. El análisis de un ataque fallido de Mastracci halló código malicioso oculto dentro de un parche aplicado a TypeScript.

Ejecutar los comandos de desarrollo esperados habría activado la carga útil. El repositorio empleaba varias capas de ocultación, entre ellas un componente escondido dentro de una imagen y un proceso desacoplado. Mastracci describió el resultado como un troyano de acceso remoto capaz de ejecutar comandos y acceder a archivos.

Ese caso no comprometió su equipo porque inspeccionó el proyecto antes de ejecutarlo. Sin embargo, demuestra por qué los consejos evidentes contra el phishing son insuficientes. El atacante no envió un rudimentario archivo ejecutable adjunto. La acción dañina estaba integrada en el trabajo que se esperaba que realizara el objetivo.

El patrón más reciente de videollamada concentra esa misma presión en una interacción en vivo. Alguien espera mientras el objetivo resuelve el problema. Los retrasos se vuelven incómodos, y una solución sugerida parece más fácil que terminar la reunión.

La variante del portapapeles resulta especialmente útil para los atacantes. Un sitio web o participante de la llamada puede proporcionar un comando sin mostrar su efecto completo en un contexto significativo. Pegarlo en una shell transfiere la confianza directamente de la conversación al sistema operativo.

Un supuesto códec funciona de manera similar. Los problemas de audio son lo bastante habituales como para que la explicación parezca rutinaria. Sin embargo, las plataformas de reuniones reales no deberían requerir una descarga personalizada de un contacto en frío para que funcione el audio básico.

La interpretación más segura no es que toda reunión desconocida sea hostil. Es que el entorno de reunión no debe recibir confianza técnica automática de la persona que la organizó.

Configurar la llamada en una plataforma conocida cambia ese equilibrio. Lo mismo ocurre al abrir repositorios inesperados únicamente dentro de entornos desechables y aislados que no contengan credenciales de producción. Ninguna medida demuestra que quien llama sea legítimo, pero ambas reducen el valor de su guion.

Esta estafa de entrevista falsa también apunta a más que contraseñas de crates.io. Una máquina de desarrollador puede contener sesiones de GitHub, credenciales de nube, claves SSH, material de firma, cookies del navegador, tokens de paquetes y acceso a repositorios privados de código fuente.

Un atacante puede usar cualquiera de esos activos para ampliar el compromiso. El crate malicioso final puede ser el resultado visible, mientras que las credenciales organizativas robadas siguen sin descubrirse.

Eso crea la inversión central detrás de Manténgase alerta: ataques dirigidos contra Rustaceans destacados. Los atacantes no están explotando principalmente el modelo de memoria de Rust. Están explotando la confianza profesional en torno a las personas que mantienen la infraestructura compartida de Rust.

La ejecución durante la compilación convierte un pequeño cambio de paquete en una gran exposición

Las versiones maliciosas eran peligrosas porque Cargo ejecutaba la dependencia del atacante durante una compilación, antes de que los desarrolladores posteriores llamaran a cualquier función de la biblioteca.

Los crates envenenados añadían una dependencia llamada proc-macro1. Ese nombre se parecía mucho a proc-macro2, un paquete legítimo ampliamente utilizado. Se trata de typosquatting, donde un atacante elige un nombre diseñado para confundirse con una dependencia de confianza.

El paquete malicioso copiaba gran parte de la apariencia del proyecto legítimo. Su comportamiento dañino residía en build.rs, el script de compilación. Esa separación ayudó a que los crates principales conservaran su código fuente esperado mientras introducían la carga maliciosa mediante una línea de dependencia.

Según un análisis técnico del paquete, el script reconstruía direcciones de red a partir de fragmentos codificados y desactivaba la validación normal de certificados. Seleccionaba una carga para Linux, Windows, macOS basado en Intel o macOS con Apple silicon.

En sistemas tipo Unix, el script escribía un ejecutable en /tmp/rust-setup y lo iniciaba sin esperar a que terminara. En Windows, creaba un script de PowerShell y utilizaba un script de Visual Basic para ejecutarlo en un proceso oculto.

Por lo demás, la compilación podía parecer exitosa. Esto es crucial porque un fallo visible suele desencadenar una investigación. Un paquete que compila normalmente ofrece a los desarrolladores menos motivos para inspeccionar una dependencia transitiva.

Los investigadores también observaron que el paquete copiado declaraba dependencias adicionales de compilación, incluidas bibliotecas de red y cifrado. Estas incorporaciones son sospechosas cuando un pequeño paquete de macros no tiene una razón clara para conectarse a internet.

Un análisis independiente recuperó el malware de segunda etapa y encontró capacidades más amplias. Entre sus funciones reportadas estaban el perfilado del host, la inspección de datos del navegador, la persistencia, la ejecución de comandos y métodos alternativos de comunicación.

La investigación de malware de Wiz encontró coincidencias de infraestructura con operaciones atribuidas en otros contextos a actores norcoreanos. El análisis relacionó patrones en rutas de comandos, rangos de alojamiento y campañas relacionadas.

Sin embargo, la coincidencia de infraestructura no equivale a una atribución concluyente. Los servidores pueden reutilizarse, copiarse, alquilarse o elegirse deliberadamente para confundir a los investigadores. El proyecto Rust tampoco llegó a afirmar que un grupo identificado fuera responsable de toda la actividad relacionada.

La conclusión prudente sigue siendo grave. La cadena técnica estaba diseñada para sobrevivir a una revisión superficial del código fuente y ejecutarse durante operaciones habituales de desarrollo. Bastaba con compilar un proyecto dependiente. Una aplicación no necesitaba invocar arrayref, internment ni append-only-vec.

Esto amplía el conjunto potencial de víctimas más allá de los despliegues en producción. Un desarrollador que actualizara un lockfile podía quedar expuesto. También un ejecutor de CI, una tarea automatizada de actualización de dependencias o herramientas del editor que invocaran Cargo al analizar un proyecto.

Un lockfile registra las versiones exactas de dependencias seleccionadas para una compilación. Cuando se confirma en el repositorio y se revisa, puede revelar si una de las versiones maliciosas entró en un proyecto. Sin embargo, un lockfile limpio hoy no demuestra que ninguna estación de trabajo resolviera una versión afectada durante la ventana de exposición.

El ataque a la cadena de suministro de Rust también demuestra por qué los totales de descargas requieren una interpretación cuidadosa. Cientos de millones de descargas históricas no implican cientos de millones de infecciones. Las versiones maliciosas estuvieron disponibles brevemente y muchos proyectos permanecieron fijados a versiones anteriores.

Aun así, una versión disponible durante poco tiempo puede llegar a sistemas sensibles porque la instalación de paquetes está automatizada. La popularidad proporciona al atacante muchas oportunidades independientes durante cada minuto que una versión permanece disponible.

Por tanto, la vía del código y la vía social se refuerzan mutuamente. Atacar a mantenedores proporciona autoridad de publicación. La ejecución durante la compilación convierte esa autoridad en ejecución inmediata de código en los entornos posteriores.

La atribución sigue siendo incierta, pero la conclusión defensiva no

Los investigadores cuentan con indicios creíbles de una campaña coordinada, pero la evidencia disponible no demuestra que todos los incidentes de Rust compartan un único operador.

La advertencia de septiembre conecta tres observaciones. Los desarrolladores de Rust afrontaron contactos personalizados en junio. La cuenta del mantenedor de arrayref fue comprometida en agosto. Los nuevos contactos sospechosos continuaron en septiembre.

Los métodos también comparten una estructura reconocible. Los atacantes construyen identidades profesionales, proponen trabajos atractivos, establecen una interacción en vivo y guían al objetivo hacia la ejecución de código. Las víctimas previstas tienen acceso que puede afectar a otros desarrolladores.

Esa consistencia respalda la evaluación de que existe una campaña. No establece una única estructura de mando, patrocinador o familia de malware.

Los equipos de Rust reconocen explícitamente esa brecha. Su alerta indica que no saben si los ataques anteriores y el ataque contra arrayref forman parte de una misma campaña. Una cobertura responsable debe preservar esa salvedad.

La conexión con la RPDC exige una cautela similar. Investigadores de seguridad han documentado campañas norcoreanas que utilizan procesos falsos de contratación contra desarrolladores de software. Algunas infraestructuras y patrones técnicos del malware de arrayref coinciden, según los informes, con operaciones atribuidas anteriormente.

Estos hallazgos hacen relevante la hipótesis, pero no la convierten en una certeza. Una advertencia pública no debe interpretarse como una atribución oficial por parte del proyecto Rust.

Otra cuestión abierta se refiere al compromiso inicial del mantenedor de arrayref. El proyecto cree que el dispositivo o las credenciales del mantenedor fueron comprometidos, pero su aviso público del incidente no ofrece una cronología forense completa.

Esto deja varias posibilidades relacionadas con sesiones robadas, credenciales, datos del navegador o acceso al endpoint. La publicación de septiembre dice que la cuenta fue comprometida mediante ataques similares, pero no publica cada paso técnico.

También se desconoce el número de víctimas exitosamente comprometidas. El registro público confirma la publicación de paquetes maliciosos y documenta contactos fallidos. No revela cuántos mantenedores instalaron software, ejecutaron comandos o informaron en privado de llamadas sospechosas.

Tampoco es público el número de infecciones posteriores. Los investigadores pueden identificar versiones maliciosas de paquetes y estimar su prevalencia, pero eso difiere de medir la ejecución real durante el limitado período de exposición.

Estas lagunas deben influir en la respuesta al incidente. Los equipos deben evitar afirmar una infección únicamente porque un proyecto dependa de un crate históricamente afectado. Deben determinar si una versión afectada fue resuelta o compilada en una máquina específica.

El error inverso es más peligroso. Un equipo no debe descartar el evento porque las versiones maliciosas se eliminaron rápidamente. Las cachés locales, los registros de CI, el historial de lockfiles, la telemetría de endpoints y la actividad de credenciales pueden conservar indicios que los manifiestos actuales ya no muestran.

Los desarrolladores que compilaron una versión afectada deben tratar el entorno relevante como potencialmente comprometido. Eliminar un crate no deshace el código que ya se ejecutó. Los secretos disponibles en esa máquina pueden requerir revocación desde un dispositivo independiente y de confianza.

La campaña también cuestiona la suposición de que la autenticación multifactor resuelve la seguridad de las cuentas. La MFA reduce muchos ataques contra credenciales, pero el malware que se ejecuta en una estación de trabajo autenticada puede robar sesiones o actuar mediante accesos existentes.

Una autenticación de paquetes más sólida sigue siendo importante. Las credenciales respaldadas por hardware, el alcance mínimo de los tokens, el acceso de publicación de corta duración y la separación entre la navegación diaria y las operaciones de lanzamiento pueden reducir la exposición. Ninguna de estas medidas vuelve irrelevante la ingeniería social.

La verdadera frontera de seguridad abarca a las personas, los endpoints, los sistemas de identidad y los registros. Proteger únicamente el inicio de sesión del registro deja demasiadas rutas alternativas hacia la autoridad de publicación.

Esa es la lección duradera de Be alert: targeted attacks on prominent Rustaceans. La atribución puede seguir sin resolverse mientras los defensores actúan sobre el mecanismo confirmado y el impacto demostrado.

Qué deben vigilar a continuación los mantenedores y los equipos de ingeniería

Las próximas señales decisivas serán más informes de mantenedores, cambios en los controles de publicación de paquetes y evidencias que vinculen nuevos contactos con infraestructura de malware conocida.

En primer lugar, hay que vigilar más revelaciones de propietarios de crates de Rust. Informes independientes que utilicen los mismos problemas en reuniones, identidades empresariales, comandos de portapapeles o plantillas de proyectos reforzarían el argumento de una operación coordinada.

Los informes que identifiquen malware diferente u objetivos no relacionados debilitarían la teoría de una única campaña. Aun así, indicarían que varios grupos consideran a los mantenedores de código abierto como valiosos intermediarios de acceso.

Los mantenedores deben conservar correos sospechosos, enlaces de reuniones, dominios, perfiles, direcciones de repositorios y marcas de tiempo. Estos detalles ayudan a los equipos de respuesta a comparar infraestructura sin exigir que las personas formulen sus propias afirmaciones de atribución.

En segundo lugar, hay que observar cómo crates.io y otros registros ajustan los controles de publicación. Los bloqueos de cuentas y la eliminación de paquetes limitaron este incidente, pero actuaron después de que aparecieran las versiones maliciosas.

Los futuros controles podrían centrarse en comportamientos de lanzamiento inusuales. Un paquete que publica su primera dependencia, retira varias versiones estables o añade componentes de compilación inesperados con capacidad de red presenta un patrón revisable.

Los registros deben equilibrar la intervención con la independencia de los mantenedores de código abierto. Una fricción excesiva puede retrasar lanzamientos de emergencia legítimos o trasladar más trabajo a voluntarios que ya están sobrecargados.

La prueba relevante es si los nuevos controles interrumpen cambios de alto riesgo sin hacer que el mantenimiento rutinario sea inmanejable. Es una compensación entre autonomía de publicación y contención del ecosistema.

En tercer lugar, hay que buscar vínculos técnicos más sólidos entre los contactos sociales y el malware recuperado. La coincidencia de dominios, certificados de cargas, rutas de comandos, artefactos de código fuente o infraestructura de alojamiento reforzaría la atribución.

Una conexión confirmada con un operador establecido podría mejorar la detección en distintos ecosistemas. No encontrar esa conexión sugeriría que las técnicas se están extendiendo entre múltiples grupos.

Las organizaciones de ingeniería no necesitan esperar esas respuestas. Pueden revisar quién posee derechos de publicación de paquetes, dónde residen las credenciales de lanzamiento y si esas credenciales comparten una estación de trabajo con la navegación diaria y las videollamadas.

Los equipos también deberían saber qué compilaciones se ejecutaron durante la ventana de exposición de agosto. Las versiones maliciosas fueron arrayref 0.3.10, internment 0.8.7 y append-only-vec 0.1.9. Cualquier aparición de proc-macro1 merece una investigación.

Esa revisión debe incluir los ejecutores de CI y las cachés locales de desarrollo, no solo el repositorio actual. Un lockfile limpiado puede ocultar una ejecución anterior si se ignoran los registros históricos.

Las organizaciones también pueden examinar las alertas de conexiones salientes inesperadas, nuevos mecanismos de persistencia, accesos inusuales al navegador y uso inexplicable de credenciales. La ejecución confirmada debe activar la rotación de credenciales y la reconstrucción desde sistemas conocidos como limpios.

Los mantenedores que reciban nuevas oportunidades deben separar la verificación social de la evaluación técnica. Verifiquen una empresa mediante canales independientes, creen la reunión en un servicio de confianza y rechacen códecs personalizados o comandos de terminal copiados.

Los repositorios inesperados deben tratarse como software no confiable. Sus instrucciones para compilar, probar o iniciar el proyecto son solicitudes para ejecutar código, incluso cuando se presentan como tareas ordinarias de una entrevista.

La pregunta final no es si Rust sigue siendo seguro como lenguaje. La seguridad de memoria no puede impedir que un script de compilación de confianza haga exactamente lo que permite el sistema operativo.

La pregunta es si el ecosistema puede proteger a los mantenedores cuya autoridad se ha convertido en un objetivo de alto valor. Atención: los ataques dirigidos contra Rustaceans destacados deberían llevar a todos los equipos de ingeniería a identificar a esas personas antes de que lo haga otro atacante. Revisen los accesos de publicación, aíslen las credenciales de lanzamiento y faciliten la denuncia de contactos sospechosos.

 
 

Empieza gratis

Un asistente de IA local-first con gestión del conocimiento personal

Para ofrecer una mejor experiencia con la IA,

actualmente remio solo es compatible con Windows 10+ (x64) y M-Chip Macs.

Tu aliado de IA para el trabajo
Haz más con remio

Planifica. Crea. Entrega.
Todo en un solo lugar.

bottom of page