Đỉnh NGUYỄN

life's a journey not a destination

Quan trọng: Lỗ hổng bảo mật ASP.NET

Leave a comment


Ngày 17/09/2010, Microsoft Security Advisory đăng tải về lỗ hổng bảo mật trong ASP.NET. Lỗ hỏng này tồn tại và ảnh hưởng đến tất cả phiên bản ASP.NET. Lỗ hổng này đã được công bố công khai vào cuối thứ sáu tại một hội nghị bảo mật. Microsoft đề nghị tất cả khách hàng ngay lập tức áp dụng một workaround (được mô tả bên dưới) để ngăn kẻ tấn công dùng lổ hổng này tất công các ứng dụng ASP.NET của bạn.

Lỗ hổng này cho phép những gì

Kẻ tấn công khai thách lỗ hổng này để gởi yêu cầu (request) và tải tập tin trong ứng dụng ASP.NET như tập tin web.config (thường chứa dữ liệu quan trọng).

Kẻ tấn công khai thác lỗ hổng này có thể giải mã (decrypt) dữ liệu được gởi tới trình duyệt trong trạng thái mã hóa (như dữ liệu ViewState trong trang).

Lỗ hổng này hoạt động như thế nào

Để hiểu lỗ hổng này hoạt động thế nào, bạn cần biết về lý thuyết mã hóa.

Cách cô lập (workaround) lỗ hổng?

Bạn có thể ngăn chặn bị khai thác lỗ hổng bằng cách bật thẻ <customErrors>, cấu hình rõ ứng dụng luôn trả về cùng một trang lỗi – dù bất kỳ lỗi gì xảy ra trên máy chủ web. Bằng cách điều hướng tất cả các trang lỗi về một trang lỗi đơn duy nhất, bạn ngăn chặn kẻ tất công phân biết giữa các dạng lỗi khác nhau xuất hiện trên máy chủ.

Quan trọng: Bậc tính năng CustomErrors hoặc RemoteOnly là chưa đủ. Bạn cần chắc rằng tất cả các lỗi được cấu hình để trả về cùng một trang lỗi. Điều này đòi hỏi bạn phải thiết lập rõ thuộc tính defaultRedirect trong thẻ <customErrors> và đảm bảo rằng không có mã tình trạng lỗi được thiết lập (status-code).

Cách cô lập lỗ hổng trên ASP.NET v1.0 đến v3.5

Nếu bạn dùng ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0, hoặc ASP.NET 3.5, bạn phải làm theo các bước sau để bật tính năng <customErrors> và điều hướng tất cả lỗi vào một trang đơn:

1) Sửa tập tin web.config ở thư mục gốc Web site, tạo nếu nó không tồn tại.

2) Tạo hoặc sửa thẻ <customErrors> của tập tin web.config như sau:

<?xml version="1.0"?>
<configuration>
    <system.web>
      <customErrors mode="On" defaultRedirect="~/error.html" />
    </system.web>
</configuration>

3) Bạn có thể thêm tập tin error.html để ứng dụng chứa thông báo lỗi phù hợp mà bạn chọn (nội dung bạn thích). Tập tin này sẽ xuất hiện bất cứ khi nào có lỗi trong ứng dụng.

Lưu ý: Điều quan trọng là thẻ customErrors được thiết lập là On, và tất cả các lỗi sẽ được điều hướng về trang chỉ ra bởi thuộc tính defaultRedirect. Không có bất kỳ mã trạng thái lỗi (status-code) nào được định nghĩa – nghĩa là không có thẻ <error> trong thẻ <customErrors>. Điều này tránh kẻ tấn công phân biệt được tại sao một lỗi xảy ra tại máy chủ và ngăn dữ liệu lỗi được công khai.

Cách cô lập lỗ hổng trên ASP.NET v.35 SP1 và v4.0

Nếu bạn dùng ASP.NET v3.5 SP1 hoặc ASP.NET v4.0, bạn phải làm theo các bước sau để bật tính năng <customErrors> và điều hướng tất cả lỗi vào một trang đơn:

1) Sửa tập tin web.config ở thư mục gốc Web site, tạo nếu nó không tồn tại.

2) Tạo hoặc sửa thẻ <customErrors> của tập tin web.config như bên dưới. Chú ý thuộc tính redirectMode=”ResponseWrite” trong ASP.NET v3.5 và ASP.NET v4.0

<?xml version="1.0"?>
<configuration>
    <system.web>
      <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />
    </system.web>
</configuration>

3) Bạn có thể thêm tập tin error.aspx để ứng dụng chứa thông báo lỗi phù hợp mà bạn chọn (nội dung bạn thích). Tập tin này sẽ xuấthiện bất cứ khi nào có lỗi trong ứng dụng.

4) Bạn nên thêm đoạn mã sau trong sự kiện Page_Load() xảy ra phía máy chủ trong trang error.aspx để tạo thời gian hoãn (delay) nhỏ, ngẩu nhiên. Điều này sẽ giúp xáo trộn lỗi.

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
   void Page_Load() {
      byte[] delay = new byte[1];
      RandomNumberGenerator prng = new RNGCryptoServiceProvider();

      prng.GetBytes(delay);
      Thread.Sleep((int)delay[0]);
        
      IDisposable disposable = prng as IDisposable;
      if (disposable != null) { disposable.Dispose(); }
    }
</script>

<html>
<head id="Head1" runat="server">
    <title>Error</title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>

Cách xác định lỗ hổng đã bị cô lập

Một khi bạn đã áp dụng các cách cô lập lỗ hổng, bạn có thể kiểm tra để chắc rằng thẻ <customErrors> được cấu hình đúng bằng cách yêu cầu (request) một URL trông như sau:

http://mysite.com/pagethatdoesnotexist.aspx

Nếu bạn nhìn thấy trang lỗi (error.html hoặc error.aspx) xuất hiện (bởi vì trang bạn yêu cầu không tồn tại) thì chứng minh bạn đã cấu hình đúng. Nếu như bạn nhìn thấy trang lỗi ASP.NET thì bạn đã sai một trong các bước trên. Để xem thông tin nguyên nhân của vấn đề, bạn có thể thử thiết lập thẻ <customErrors mode=”remoteOnly”> – cho phép xem thông tin lỗi ASP.NET khi bạn yêu cầu Web site từ máy cục bộ.

Cách tìm lỗ hổng trong ứng dụng ASP.NET trên máy chủ Web

Microsoft đã tạo ra đoạn mã Visual Basic for Application (.vbs) mà bạn có thể chạy trên máy chủ Web để xác định ứng dụng ASP.NET nào được cài đặt, hoặc thẻ <customErrors> bật hay tắt, hoặc các thông tin lỗi khác nhau tùy theo mã trạng thái.

Bạn có thể tải đoạn mã .vbs tại đây. Mở cửa sổ command prompt với tài khoản admin và chạy “cscript DetectCustomErrors.vbs”. Nó sẽ quét qua tất cả ứng dụng trong máy chủ Web và xác định cấu hình <customErrors> có được thiết lập đúng.

image

Nó sẽ đánh dấu bất kỳ ứng dụng ASP.NET nào mà không có thẻ <customErrors> trong tập tin web.config ở thư mục gốc hoặc chưa cấu hình đúng cách cô lập lỗ hổng để tránh bị tấn công. Nó sẽ in ra chứ “ok” với mỗi ứng dụng thỏa. Hy vọng sẽ sớm giúp bạn xác định vấn đề.

Lưu ý: Microsoft chỉ phát triển đoạn mã này trong thời gian ngắn, và có thể sẽ cập nhật thay đổi trong tương lai. Hãy luôn quay trở lại để xem các bản cập nhật thay đổi.

Cách tìm thêm thông tin về lỗ hổng

Bạn có thể tìm thêm nhiều thông tin về lỗ hổng tại

Diễn đàn thảo luận

Microsoft đã tạo ra một góc thảo luận về lỗ hổng trên trang www.asp.net giúp thảo thuật và tìm câu trả lời cho các câu hỏi liên quan đến lỗ hổng.

Tổng kết

Microsoft đã đăng tải chi tiết thông tin lỗi, và cũng sẽ phát hành bản vá để khắc phục lỗ hổng này (tránh phải cô lập lỗ hổng một cách thủ công như trên).

Advertisements

Author: dinhnn

Senior software developer, a technical leader. You can be reached at via email to dinhnguyenngoc@gmail.com, via my blog at dinhnguyenngoc.wordpress.com, and on Twitter @dinhnguyenngoc.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s