• Versiones afectadas: >1.0.5
  • Versiones corregidas: <3.9.2

Resumen

Una mala configuración al apuntar a recursos estáticos en aiohttp cuando se emplea como servidor web puede provocar un Path Traversal pudiendo leer archivos internos del sistema.

Revisión

Cuando un servidor emplea aiohttp como servidor web. Debemos configurar rutas estáticas donde es necesario indicar la ruta raíz de los archivos estáticos (como por ejemplo /static/). Si además empleamos follow_symlinks y le indicamos True esto hará que no compruebe que la ruta apuntada se encuentra dentro del directorio raíz de los archivos estáticos.

Código vulnerable & PoC

Imaginemos que existe una aplicación web donde emplea aiohttp de la siguiente manera:

import asyncio
from aiohttp import web
import pathlib

BASE_DIR = pathlib.Path(__file__).parent
STATIC_DIR = BASE_DIR / "static"

async def handle(request):
    name = request.match_info.get('name', 'Anonymous')
    return web.Response(text=f'Hello, {name}!')

app = web.Application()
app.router.add_route('GET', '/', handle)
app.router.add_route('GET', '/{name}', handle)
app.router.add_static('/static/', path=STATIC_DIR, name='static', follow_symlinks=True)

loop = asyncio.get_event_loop()
server = loop.run_until_complete(loop.create_server(app.make_handler(), '0.0.0.0', 8080))

print("======= http://0.0.0.0:8080/ =======")
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass
finally:
    server.close()
    loop.run_until_complete(server.wait_closed())
    loop.run_until_complete(app.cleanup())
    loop.close()

En este caso la aplicación en la ruta de los archivos estáticos llamada static indica con follow_symlinks=True que no quiere comprobar que la ruta apuntada esté dentro de static.

Código vulnerable:

app.router.add_static('/static/', path=STATIC_DIR, name='static', follow_symlinks=True)

PoC

Un atacante puede explotar un Path Traversal gracias a follow_synlinks=True. Para explotarlo interceptaremos la petición apuntando a /static/:

Entonces al no a ver valicación de que se apunte a archivos que estén en /static/ podremos explotar un Path Traversal:

Exploit

También hay que tener en cuenta que tenemos a disposición este tipo de scripts donde también podemos ver como se explota esta vulnerabilidad. Comparto su exploit público en exploit-db creado por beafn28:

https://www.exploit-db.com/exploits/52474

Solución

  • Actualizar a la versión más reciente de aiohttp
  • No emplear follow_symlinks=True, si lo usa en su aplicación web se recomienda quitarlo para evitar problemas.