ASP.NET MS11-100 : 게시 된 최대 양식 값 수에 대한 제한을 어떻게 변경할 수 있습니까?


196

Microsoft는 최근 (12-29-2011) .NET Framework의 몇 가지 심각한 보안 취약점을 해결하기위한 업데이트를 발표했습니다. MS11-100에 의해 도입 된 픽스 중 하나는 해시 테이블 충돌과 관련된 잠재적 인 DoS 공격을 일시적으로 완화합니다. 이 수정 프로그램은 많은 POST 데이터가 포함 된 페이지를 손상시킵니다. 이 경우 매우 큰 확인란 목록이있는 페이지에서. 왜 이런 경우입니까?

일부 비공식 출처는 MS11-100이 포스트 백 품목에 500을 제한한다는 것을 나타냅니다. 이를 확인하는 Microsoft 소스를 찾을 수 없습니다. View State 및 기타 프레임 워크 기능 이이 한계 중 일부를 차지한다는 것을 알고 있습니다. 이 새로운 제한을 제어하는 ​​구성 설정이 있습니까? 우리는 확인란을 사용하지 않아도되지만 특정 상황에서는 잘 작동합니다. 또한 다른 불쾌한 것들로부터 보호하기 때문에 패치를 적용하고 싶습니다.

500 개의 한도를 논의하는 비공식 출처 :

이 게시판은 단일 HTTP POST 요청에 대해 제출할 수있는 변수의 수를 제한하여 DOS 공격 경로를 수정합니다. 기본 제한은 500이며 일반적인 웹 응용 프로그램에는 충분하지만 독일 보안 연구원의 설명에 따라 공격을 중화 할 수있을 정도로 낮습니다.

편집 : 한계 예제가있는 소스 코드 (500이 아닌 1,000으로 나타남) 표준 MVC 응용 프로그램을 만들고 기본 색인보기에 다음 코드를 추가하십시오.

@using (Html.BeginForm()) 
{
    <fieldset class="fields">
        <p class="submit">
            <input type="submit" value="Submit" />
        </p>

        @for (var i = 0; i < 1000; i++)
        {
            <div> @Html.CheckBox("cb" + i.ToString(), true) </div>
        } 
    </fieldset>
}

이 코드는 패치 이전에 작동했습니다. 이후에는 작동하지 않습니다. 오류는 다음과 같습니다

[InvalidOperationException : 개체의 현재 상태로 인해 작업이 유효하지 않습니다.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () +82 System.Web.HttpValueCollection.FillFromEncodedBytes (Byte [] bytes, Encoding encoding) +111
System.Web. HttpRequest.FillInFormCollection () +307


추가 레거시를 수행하고 구체적으로 500으로 표시된 섹션을 게시하는 방법은 어떻습니까?
— OO

3
그게 다야. 섹션이 없습니다 (Microsoft의 섹션). 비공식적 인 주석가들로부터 자신의 의견을 모를 수도 있고 모를 수도 있습니다. 어쨌든 링크와 스 니펫을 게시했습니다.
— colithium

1
@Andrew : 내가 생각할 수있는 유일한 "멀티 선택 목록"은 SelectionMode가 Multiple로 설정된 ListBox입니다. 실제로 여러 값을 게시 할 수 있습니다. 그러나 질문에는 "드롭 다운 목록"이 언급되어 있습니다. 그런 다음 질문 작성자의 의견을 기다립니다.
— Wiktor Zychla

1
이 주제에 대한 최근의 질문에 따르면이 수정 프로그램은 게시물 수를 제한하여 DOS를 완화 시켰습니다.
— John Saunders

1
자세한 내용은 support.microsoft.com/kb/2661403 을 참조하십시오 .

답변:


275

web.config에서이 설정을 추가하십시오. 방금 ASP.NET MVC 2 프로젝트로 .NET 4.0에서 이것을 테스트 했으며이 설정으로 코드가 throw되지 않습니다.

<appSettings>
  <add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>

이제 보안 업데이트를 적용한 후 제한이 변경됩니다.


아직 컴퓨터를 업데이트하지 않았으므로 Reflector를 사용하여 HttpValueCollection 클래스를 확인했지만 ThrowIfMaxHttpCollectionKeysExceeded메서드 가 없었습니다 .

여기에 이미지 설명을 입력하십시오

KB2656351 (.NET 4.0 업데이트)을 설치 하고 Reflector에서 어셈블리를 다시로드하면 다음과 같은 방법이 나타납니다.

여기에 이미지 설명을 입력하십시오

그래서 그 방법은 확실히 새로운 것입니다. Reflector 에서 Disassemble 옵션을 사용했으며 코드에서 알 수있는 내용은 AppSetting을 확인합니다.

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}

web.config 파일에서 값을 찾지 못하면 1000 System.Web.Util.AppSettings.EnsureSettingsLoaded(내부 정적 클래스)으로 설정합니다.

 _maxHttpCollectionKeys = 0x3e8;

또한 Alexey Gusarov는 이틀 전에이 설정에 대해 트윗했습니다.

그리고 여기 조나단 네스 (보안 개발 매니저, MSRC)와 피트 Voss이 (미스터 응답 커뮤니케이션 매니저, 신뢰할 수있는 컴퓨팅)와 Q & A에서 공식적인 답변은 다음과 같습니다

Q : AppSettings.MaxHttpCollectionKeys는 최대 양식 항목 수를 포함하는 새 매개 변수입니까?

A : 그렇습니다.


25
훌륭한. 이 날 유래 사랑하게 답변의 친절
— colithium

4
정말 도움이되었으므로 +2를 줄 수 있도록 다른 계정이 있었으면 좋겠습니다.
— misha

1
전체 서버의 applicationhost.config에서 업데이트 할 수 있습니까? 또는 machine.config?
— andryuha

1
페이지 당 수준에서이 제한을 제어 할 수있는 방법이 있습니까? (또한 요청 여기 와 여기에 .)
— 마이크 오클라호마

1
일부 사람들은 웹 페이지에 이러한 많은 양식 필드를 포함하지 않아야하므로 웹 페이지 검토를 제안했습니다. 그러나 우리는이 오류에 대해 매우 유효한 시나리오를 가지고있었습니다. 고객의 전자 상거래 사이트 중 하나에있는 장바구니에 많은 항목이 있었으며 페이지에 액세스 할 때이 오류가 기록되었습니다. 이러한 경우 최대 값을 재정의하는 것이 가장 좋습니다.
— Ankur-m

18

여전히 .NET 1.1을 사용하는 사용자의 경우이 설정은 web.config를 통해 구성되지 않습니다. 레지스트리 설정입니다 (Reflector를 통해 답을 찾은 것과 같은 방식으로 만 발견했기 때문에 michielvoo의 팁). 아래 예제 MaxHttpCollectionKeys는 32 비트 버전의 Windows에서 5000으로 설정 됩니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

64 비트 Windows 에디션의 경우 Wow6432Node에서 키를 설정하십시오.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

이 보안 픽스가 완화해야하는 DoS 공격과 관련하여 5000이 합리적으로 안전한지 여부에 대한 정보가 있습니까? 우리는 동일한 5000 값을 사용하는 것을보고 있지만 공격에서 요청 당 소비 된 값과 CPU 시간 사이의 관계에 대한 정보를 찾을 수 없습니다.
— Tao

4

이상한 것을 보는 사람들을 위해 여기 $ 0.02를 추가하고 싶습니다.

응용 프로그램이 페이지 정보를 ASP.NET ViewState에 보관하고 웹 서버 임계 값을 초과하면이 문제가 발생합니다. web.config 수정 문제를 바로 적용하는 대신 먼저 코드 최적화를 살펴볼 수 있습니다.

소스보기를보고 1000 개 이상의 viewstate 숨겨진 필드를 찾으면 문제가 있습니다.


1000 개 이상의 viewstate 필드? 양식에 ViewState 필드가 하나만있는 것은 아닙니다. 값은 양식 필드 수가 증가함에 따라 증가합니다.
— Ankur-m

3

ThrowIfMaxHttpCollectionKeysExceeded()에 추가되었습니다 System.Web.HttpCookieCollection.

HttpCookieCollection.Get()호출 될 때 , 내부적으로 호출 HttpCookieCollection.AddCookie()하고 다음에 호출하는 것처럼 보입니다 ThrowIfMaxHttpCollectionKeysExceeded().

public HttpCookie Get(string name)
{
    HttpCookie cookie = (HttpCookie) base.BaseGet(name);
    if ((cookie == null) && (this._response != null))
    {
        cookie = new HttpCookie(name);
        this.AddCookie(cookie, true);
        this._response.OnCookieAdd(cookie);
    }
    return cookie;
}

internal void AddCookie(HttpCookie cookie, bool append)
{
    this.ThrowIfMaxHttpCollectionKeysExceeded();
    this._all = null;
    this._allKeys = null;
    if (append)
    {
        cookie.Added = true;
        base.BaseAdd(cookie.Name, cookie);
    }
    else
    {
        if (base.BaseGet(cookie.Name) != null)
        {
            cookie.Changed = true;
        }
        base.BaseSet(cookie.Name, cookie);
    }
}

우리가보고있는 것은 2 시간 동안 웹 사이트가을 던지기 시작할 때까지 점점 느리고 버그가 많다는 것 InvalidOperationExcpetion입니다. 그런 다음 앱 풀을 재활용하면 몇 시간 동안 문제가 해결됩니다.


쿠키 수 제한은 잘 잡 힙니다. 설명하는 속도 저하 및 버그로 인해 요청의 쿠키 수와 실제로 관련이 있는지 알고 있습니까? 고객의 요청을 확인 했습니까? (앱이 의도적으로 많은 쿠키로 무언가를하고 있습니까?)
— Tao

1
앱 시작시 Request.Cookies 컬렉션에 대한 싱글 톤 참조를 잘못 잡은 사용자 정의 CookieProvider가있는 것으로 나타났습니다. 그런 다음 모든 후속 요청에서 정적 쿠키 컬렉션 내에 하나 이상의 쿠키가 있는지 확인합니다. ... 위 코드에서 볼 수 있듯이 .Net ADDS는 해당 쿠키를 찾지 못한 경우 기본적으로 해당 쿠키를 찾습니다. 시간이 지남에 따라 각 사용자가 시스템에 액세스 할 때이 싱글 톤 컬렉션에 다양한 쿠키가 추가되었습니다. 사이트가 쿠키와 함께 또는 쿠키없이 작동하도록 설계되었으므로이 버그는 확인되지 않았습니다 (지금까지)
— Joshua Barker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.