Microsoft는 최근 (12-29-2011) .NET Framework의 몇 가지 심각한 보안 취약점을 해결하기위한 업데이트를 발표했습니다. MS11-100에 의해 도입 된 픽스 중 하나는 해시 테이블 충돌과 관련된 잠재적 인 DoS 공격을 일시적으로 완화합니다. 이 수정 프로그램은 많은 POST 데이터가 포함 된 페이지를 손상시킵니다. 이 경우 매우 큰 확인란 목록이있는 페이지에서. 왜 이런 경우입니까?
일부 비공식 출처는 MS11-100이 포스트 백 품목에 500을 제한한다는 것을 나타냅니다. 이를 확인하는 Microsoft 소스를 찾을 수 없습니다. View State 및 기타 프레임 워크 기능 이이 한계 중 일부를 차지한다는 것을 알고 있습니다. 이 새로운 제한을 제어하는 구성 설정이 있습니까? 우리는 확인란을 사용하지 않아도되지만 특정 상황에서는 잘 작동합니다. 또한 다른 불쾌한 것들로부터 보호하기 때문에 패치를 적용하고 싶습니다.
이 게시판은 단일 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
답변
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는 이틀 전에이 설정에 대해 트윗했습니다.
- http://twitter.com/#!/tr_tr_mitya/status/152473667102715904
- http://twitter.com/#!/tr_tr_mitya/status/152475158941138944
그리고 여기 조나단 네스 (보안 개발 매니저, MSRC)와 피트 Voss이 (미스터 응답 커뮤니케이션 매니저, 신뢰할 수있는 컴퓨팅)와 Q & A에서 공식적인 답변은 다음과 같습니다
Q : AppSettings.MaxHttpCollectionKeys는 최대 양식 항목 수를 포함하는 새 매개 변수입니까?
A : 그렇습니다.
답변
여전히 .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
답변
이상한 것을 보는 사람들을 위해 여기 $ 0.02를 추가하고 싶습니다.
응용 프로그램이 페이지 정보를 ASP.NET ViewState에 보관하고 웹 서버 임계 값을 초과하면이 문제가 발생합니다. web.config 수정 문제를 바로 적용하는 대신 먼저 코드 최적화를 살펴볼 수 있습니다.
소스보기를보고 1000 개 이상의 viewstate 숨겨진 필드를 찾으면 문제가 있습니다.
답변
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
입니다. 그런 다음 앱 풀을 재활용하면 몇 시간 동안 문제가 해결됩니다.