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.