Description
### Impacthttp4s уязвим для атак с разделением ответов или запросов, когда ненадежный пользовательский ввод используется для создания любого из следующих полей:* Имена заголовков (`Header.name `о* Значения заголовка (`Header.value`)* Фразы о причинах состояния (`Status.reason`)* Пути URI (`Uri.Path`)* Зарегистрированные имена URI authority (`URI.RegName`) (до 0.21) Следующие серверные программы небезопасным образом отображают недопустимые символы возврата каретки, новой строки или null.| | blaze-сервер | ember-сервер | blaze-клиент | ember-клиент | jetty-клиент ||:---------------|:-------------|:-------------|:-------------|--------------|--------------|| имена заголовков | ⚠ | ⚠ | ⚠ | ⚠ | ⚠ | | значения заголовка | ⚠ | ⚠ | ⚠ | ⚠ | || причины статуса | ⚠ | ⚠ | | | // Пути к URI | | | ⚠ | ⚠ | |/ Имена URI | | | ⚠ < 0.22 | ⚠ < 0.22 | | Например, учитывая следующую службу:``scalaimport cats.effect._import org.http4s._import org.http4s.dsl.io._import org.http4s.server.blaze.BlazeSErverBuilderimport scala.concurrent.ExecutionContext.globalobject ResponseSplit расширяет IOApp { переопределяет def run(аргументы: Список[строка]): IO[код выхода] = BlazeSErverBuilder[IO](глобальный) .bindHttp(8080) .withHttpApp(httpApp) .resource .use(_ => IO.never) val httpApp: HttpApp[IO] = HttpApp[IO] { req => req.params.get("автор") соответствует { case Some(автор) => Ok("Реальный контент") .map(_.putHeaders(Заголовок("SEt-Cookie", s"author=${author}"))) case None => BadRequest("Нет параметра автора") } }}``Чистый параметр `author` возвращает чистый ответ:``shcurl -i 'http://localhost:8080/?author=Ross "```httpHTTP/1.1 200 OKContent-Тип: текстовый/обычный; кодировка=UTF-8SEt-Cookie: автор=RossDate: Пн, 20 сентября 2021 г. 04:12:10 GMTContent-Длина: 16 Реальное содержимое``Вредоносный параметр `автор" позволяет пользовательскому агенту перехватывать ответ с нашего сервера и возвращать другое содержимое:"`shcurl -i 'http://localhost:8080/?author=hax0r%0d%0aContent-Length:+13%0d%0a%0aI+hacked+you "```httpHTTP/1.1 200 OKContent-Тип: текстовый/обычный; кодировка=UTF-8SEt-Cookie: author=hax0rContent-Длина: 13 Я взломал вас``### Версии исправлений 0.21.29, 0.22.5, 0.23.4 и 1.0.0-M27 выполняют следующее:* Если фраза, указывающая причину статуса, неверна, она удаляется. Рендеринг необязателен в соответствии со спецификацией.* Если имя заголовка недопустимо в запросе или ответе, заголовок удаляется. Нет никакого способа в общем случае очистить заголовок без потенциального затенения правильного.* Если значение заголовка недопустимо в запросе или ответе, оно очищается путем замены null (`\u0000`), возврата каретки (`\r`) и новой строки (`\n`) символами пробела (` `) в соответствии со спецификацией.* Если путь URI или зарегистрированное имя является недопустимым в строке запроса, клиент вызывает "Исключение IllegalArgumentException".* Если зарегистрированное имя URI недопустимо в заголовке хоста, клиент вызывает исключение 'IllegalArgumentException'. ## Службы # Workaroundshttp4s и клиентские приложения должны обрабатывать любой пользовательский ввод в вышеупомянутые поля, прежде чем возвращать запрос или ответ серверной части. Символы возврата каретки, новой строки и null являются наиболее опасными.Затронуты были не все серверные части: jetty-сервер, tomcat-сервер, armeria и netty на сервере; async-http-клиент, okhttp-клиент, armeria и netty в качестве клиентов.### Ссылки* https://owasp.org/www-community/attacks/HTTP_Response_Splitting * https://httpwg.org/http-core/draft-ietf-httpbis-semantics-latest.html#fields.values ### Для получения дополнительной информации, если у вас есть какие-либо вопросы или комментарии по поводу этот совет:* Откройте проблему на [GitHub](http://github.com/http4s/http4s )* Свяжитесь с нами через [политику безопасности http4s](https://github.com/http4s/http4s/security/policy )