A Cross-Site Request Forgery (CSRF) vulnerability in the parisneo/lollms-webui project allows remote attackers to execute arbitrary code on a victim's system. The vulnerability stems from the `/execute_code` API endpoint, which does not properly validate requests, enabling an attacker to craft a malicious webpage that, when visited by a victim, submits a form to the victim's local lollms-webui instance to execute arbitrary OS commands. This issue allows attackers to take full control of the victim's system without requiring direct network access to the vulnerable application.
Activé CORS porque tenía una interfaz de usuario de desarrollo que usa otro número de puerto y luego olvidé eliminarla. Entonces, lo que acabo de hacer es: - Primero eliminé la configuración de cors que permite a todos acceder a ella: antes: ```python sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*", ping_timeout=1200, ping_interval= 30) # Habilite CORS para cada ``` después de: ```python cert_file_path = lollms_paths.personal_certificates/"cert.pem" key_file_path = lollms_paths.personal_certificates/"key.pem" si os.path.exists(cert_file_path) y os .path.exists(key_file_path): is_https = True else: is_https = False # Crear un servidor Socket.IO sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins=config.allowed_origins+[f"https://localhost:{ config['port']}" if is_https else f"http://localhost:{config['port']}"], ping_timeout=1200, ping_interval=30) # Habilitar CORS para orígenes seleccionados ``` - Segundo, He actualizado lollms para que tenga dos modos (un modo sin cabeza y un modo ui). Y actualizó /execute_code para bloquear si el servidor no tiene cabeza o está expuesto ```python @router.post("/execute_code") async def ejecutar_code(request: Request): """ Ejecuta el código Python y devuelve la salida. : solicitud de parámetro: el objeto de solicitud HTTP. :return: una respuesta JSON con el estado de la operación. """ if lollmsElfServer.config.headless_server_mode: return {"status":False,"error":"La ejecución del código está bloqueada cuando está en ¡modo sin cabeza por razones obvias de seguridad!"} if lollmsElfServer.config.host=="0.0.0.0": return {"status":False,"error":"La ejecución del código se bloquea cuando el servidor está expuesto al exterior por razones muy obvias !"} intente: datos = (espera solicitud.json()) código = datos["código"] id_discusión = int(data.get("id_discusión","discusión_desconocida")) id_mensaje = int(data.get("id_mensaje) ","unknown_message")) language = data.get("language","python") if language=="python": ASCIIColors.info("Ejecutando código python:") ASCIIColors.amarillo(código) return ejecutar_python(código) , id_discusión, id_mensaje) if idioma=="javascript": ASCIIColors.info("Ejecutando código javascript:") ASCIIColors.amarillo(código) devuelve ejecutar_javascript(código, id_discusión, id_mensaje) si el idioma está en ["html","html5" ,"svg"]: ASCIIColors.info("Ejecutando código javascript:") ASCIIColors.amarillo(código) return ejecutar_html(código, id_discusión, id_mensaje) elif language=="latex": ASCIIColors.info("Ejecutando código latex:" ) ASCIIColors.amarillo(código) devuelve ejecutar_latex(código, id_discusión, id_mensaje) lenguaje elif en ["bash","shell","cmd","powershell"]: ASCIIColors.info("Ejecutando código de shell:") ASCIIColors. amarillo(código) devuelve ejecutar_bash(código, id_discusión, id_mensaje) idioma elif en ["sirena"]: ASCIIColors.info("Ejecutando código de sirena:") ASCIIColors.amarillo(código) devuelve ejecutar_mermaid(código, id_discusión, id_mensaje) idioma elif en ["graphviz","punto"]: ASCIIColors.info("Ejecutando código Graphviz:") ASCIIColors.amarillo(código) return ejecutar_graphviz(código, id_discusión, id_mensaje) return {"status": False, "error": " Idioma no admitido", "execution_time": 0} excepto excepción como por ejemplo: trace_exception(ex) lollmsElfServer.error(ex) return {"status":False,"error":str(ex)} ``` También agregué un opcional modo https y esperamos agregar una autenticación completa con cookies y una sesión personal, etc. Todas las actualizaciones estarán en la versión 9.1 nuevamente, muchas gracias por su trabajo. Lo haré más difícil la próxima vez, pero si encuentras más errores, sé mi invitado :)