2011-12-21 22 views
6

Trong trường hợp bạn chưa từng nghe đoạn mã này sẽ gây ra một vụ tai nạn BSoD trên x64 bit Windows 7 khi chạy trong SafariTại sao thẻ iframe này khiến Safari trên x64 Windows bị lỗi?

<iframe height='18082563'></iframe> 

Vì vậy, một cách tự nhiên câu hỏi là cách chính xác nó xảy ra, và tại sao 18082563 và không nói "1808256 "?

+2

Đây là điều bạn phải hỏi Apple. Có lẽ giá trị cụ thể đó gây ra lỗi hàng rào của một số loại trong mã. –

+3

Trên thực tế bạn sẽ phải hỏi Microsoft vì nó là một [vấn đề trong win32k.sys] (https://secunia.com/advisories/47237/) – Luke

+0

Trong khi đó là một vấn đề MS tại sao nó chỉ được kích hoạt trong Safari? – DaveHogan

Trả lời

8

Đây là giải thích cho nó.

http://pastebin.com/XTWnLF3p

Lỗi xảy ra do yêu cầu NineGrid sắp qua GdiDrawStream gửi thay mặt cho UX Theme DLL mà xử lý của Windows Themes bắt đầu trong XP và sau đó.

Trình duyệt webkit (cùng với IE8 - nhưng không phải IE9, dường như) cố gắng hiển thị các phần tử HTML trên trang bằng cách sử dụng vùng gốc của hệ điều hành. Trong trường hợp này, trong hàm drawControl (xem http://www.opensource.apple.com/source/WebCore/WebCore-658.28/rendering/RenderThemeWin.cpp), DrawThemeBackground được gọi, xử lý skinning của các điều khiển OS.

Bộ đệm byte 96 (0x60) được gửi (tham số 2 và 3 của GdiDrawStream là kích thước và địa chỉ bộ đệm, tham số 1 là HDC).

Vẽ bộ đệm hơi nước bắt đầu bằng giá trị phép thuật, theo sau là một loạt các lệnh được xác định bởi thị trường 32 byte. Đây là dòng gửi với iframe đặc biệt khi quan sát trong Safari:

44727753 = 'DrwS' = DrawStream kỳ diệu

lệnh Buffers:

#0: 00000000 <SET TARGET> 
    3b01017a // Destination DC (hdc) *** Must match HDC in GdiDrawStream argument 1 *** 
    // Destination Clip (ERECTL): 
    0000011b // Left 
    00000011 // Top 
    0000012c // Right 
    0089f580 // Bottom    *** Multiply by 2, and you get the "magic" value used in the iframe PoC *** 
#1: 00000001 <SET SOURCE> 
    058506a3 // Source Surface (pso) *** Dumped the surface from kernel mode, got a 13x5 32BPP bitmap which is the Luna/Aero scrollbar slider control *** 
#2: 00000009 <NINEGRID> 
// Destination Clip (ERECTL):   *** Should match the Destination Clip of the Target 
    0000011b // Left 
    00000011 // Top 
    0000012c // Right 
    0089f580 // Bottom 
// Source Clip (ERECTL):     *** Should be within the bounds of the surface (which is 13x5 in this case) 
    00000000 // Left 
    00000000 // Top 
    0000000e // Right 
    00000001 // Bottom 
// NINEGRID_BITMAP_INFO    *** Documented in RDP docs. Should fit within the surface and destination. 
    00000001 // Flags (DSDNG_STRETCH) 
    0000000a // Left Width 
    00000003 // Right Width 
    00000000 // Top Height 
    00000000 // Bottom Height 
    00000000 // Transparent 

Đây là bãi chứa nguyên:

0: kd> dds @r8 l18 
00000000`003be664 44727753 
00000000`003be668 00000000 
00000000`003be66c 2b0108d5 // HDC, this will change from dump to dump 
00000000`003be670 0000011b 
00000000`003be674 00000011 
00000000`003be678 0000012c 
00000000`003be67c 0089f580 
00000000`003be680 00000001 
00000000`003be684 018503c2 // Bitmap Surface, this will change from dump to dump 
00000000`003be688 00000009 
00000000`003be68c 0000011b 
00000000`003be690 00000011 
00000000`003be694 0000012c 
00000000`003be698 0089f580 
00000000`003be69c 00000000 
00000000`003be6a0 00000000 
00000000`003be6a4 0000000e 
00000000`003be6a8 00000001 
00000000`003be6ac 00000001 
00000000`003be6b0 0000000a 
00000000`003be6b4 00000003 
00000000`003be6b8 00000000 
00000000`003be6bc 00000000 
00000000`003be6c0 00000000 

Về cơ bản bạn đang thấy là một khung nội tuyến có chiều cao đặc biệt thú vị, khi thanh cuộn đang được vẽ và theo chủ đề, lỗi toán học trong thẻ NineGrid tra nsform gây ra một out-of-bounds viết. PoC này sẽ làm việc trong IE 8, nhưng IE 8 có một lỗi CSS nổi tiếng, nơi nó có giới hạn pixel tối đa (khoảng 1342177), đó là lý do tại sao nó không thể hiện ngay lập tức.

CÁC KHẢ NĂNG KHÁC CÓ THỂ KHÁC và một số có thể đủ nhỏ để thậm chí IE 8 truy cập trường hợp góc cao NineGrid.

IE9 dường như không điều khiển chủ đề bằng UxTheme, và hành vi thanh cuộn của nó khác với IE 8, vì vậy mặc dù giới hạn pixel không còn ở đó, PoC không hoạt động. Firefox không được kiểm tra.

KHÔNG CHỈ TRÊN NỘI DUNG CÓ THỂ HOÀN THÀNH. Thử nghiệm với một mã HTML có cùng chiều cao cũng dẫn đến sự cố trong Safari.

Điều này có nghĩa là bất kỳ khách hàng, cục bộ hoặc từ xa nào, điều khiển da (ví dụ: hầu hết tất cả - ngay cả nút trên flash flash) có thể dẫn đến chuyển đổi NineGrid lỗi. Nó không hoàn toàn cụ thể đối với WebKit.

1

Như một lưu ý, MS gần đây đã phát hành MS12-008 sửa lỗi này.

Các vấn đề liên quan