Рекомендуемый конфиг Nginx (Sub Page) для защиты от path-traversal

  location /assets/ {
    limit_except GET {
      deny all;
    }

    proxy_http_version 1.1;
    proxy_pass http://remnawave-subscription-page/assets/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Authorization "";

    proxy_intercept_errors on;
    error_page 400 401 403 404 405 500 502 @redirect;
  }

  location ~ "^/qwertyuiop/(?<shortuuid>[A-Za-z0-9_-]{16})$" {
    limit_except GET {
      deny all;
    }

    if ($args != "") {
      return 404;
    }

    proxy_http_version 1.1;
    proxy_pass http://remnawave-subscription-page/qwertyuiop/$shortuuid;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Authorization "";

    proxy_intercept_errors on;
    error_page 400 401 403 404 405 500 502 @redirect;
  }

  location ~ "^/qwertyuiop/(?<shortuuid>[A-Za-z0-9_-]{16})/(?<client_type>json|v2ray-json|mihomo|singbox|stash|clash)$" {
    limit_except GET {
      deny all;
    }

    if ($args != "") {
      return 404;
    }

    proxy_http_version 1.1;
    proxy_pass http://remnawave-subscription-page/qwertyuiop/$shortuuid/$client_type;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Authorization "";

    proxy_intercept_errors on;
    error_page 400 401 403 404 405 500 502 @redirect;
  }

  location / {
    return 404;
  }

  location @redirect {
    return 404;
  }

Данный пример конфига позволяет фильтровать запросы, связанные с недавней уязвимостью в subscription page (включая версии ниже 7.2.4). Всё, что не соответствует паттернам shortuuid - даже не доходит до контейнера subscription page.

Регулярка работает только в случае, если вы не указывали shortUuid самостоятельно при создании юзера, а доверяли генерацию панели. И если не меняли дефолтную длину генерируемого shortUuid через SHORT_UUID_LENGTH в env панели.

qwertyuiop нужно заменить на ваш CUSTOM_SUB_PREFIX (или вовсе убрать, если у вас его нет).

Я не шарю за Caddy. Было бы хорошо, если кто-то покажет аналогичный конфиг для Caddy.

5 Likes