Công nghệ HTML5 và an ninh ứng dụng

177

Tác giả: VTC Security Team

HTML5 (kết hợp với CSS3) đã và đang dần dần thay thế HTML4 để trở thành ngôn ngữ Web của tương lai. HTML5 có thể sử dụng để xây dựng những ứng dụng trên nền web mà không còn phải chịu những rào cản công nghệ như HTML4. Đặc biệt HTML5 tương thích với mọi loại thiết bị di động, một xu hướng tất yếu trong xã hội hiện đại ngày nay.
Tại sao nó lại được đánh giá cao như vậy?
Chúng ta sẽ điểm qua một vài công nghệ nổi bật trong kiến trúc của HTML 5 trước khi phân tích một số nguy cơ an ninh đối với ứng dụng triển khai.

Phần 1: Giới thiệu công nghệ

HTML 5 mang trong mình nhiều công nghệ mới lần đầu tiên được biết đến như: localstorage, webSQL, websocket, webworker, enhanced XHR, DOM based Xpath,…

cntt_anud1

 

Web Worker
Web worker là một hàm API mới xuất hiện trong HTML 5 cho phép những nhà phát triển web có thể thoải mát phát triển các đoạn mã javascript mà không sợ trình duyệt của người dùng quá tải. Nếu như trước khi web worker ra đời, trình duyệt phải xử lý tất cả các đoạn mã từ đơn giản đến phức tạp thì giờ đây, việc xử lý các đoạn mã phức tạp đều được giao cho worker, trình duyệt chỉ nhận lại kết quả từ worker để tiến hành xử lý tiếp.
Để triển triển khai webworker, đầu tiên khởi tạo đối tượng WebWorker như sau:
worker = new Worker(“WebWorker.js”);
Khi có yêu cầu sử dụng worker, tập tin script trong file js sẽ được tải về và thực thi. Để tương tác với tập tin script ta sử dụng phương thức postMessage(). Phương thức này chấp nhận tham số chứa thông điệp cần gửi đến tập tin script để xử lý. Sau khi xử lý xong, tập tin script sẽ trả dữ liệu về thông qua thuộc tính data của tham số event trong hàm xử lý sự kiện message. Khi xử lý hoàn thành công việc, ta sẽ giải phóng cho worker bằng phương thức terminate().

Web Storage
Sự xuất hiện của Web Storage trên HTML5 đánh dấu một bước đột phát trong việc ra đời các ứng dụng web có khả năng tương tác và nạp dữ liệu ngay tức thì trên trình duyệt. Với khả năng lưu trữ lớn gấp nhiều lần so với cookie ( 10Mb đối với IE và 5Mb đối với các trình duyệt khác) người dùng có thể thoải mái lưu trữ nhiều dữ liệu đối với nhiều domain khác nhau và sử dụng lại chúng mà không cần gửi request tới server.
Mỗi đối tượng Storage là một danh sách các cặp key/value, cả key và value đều là kiểu string. Khi một đối tượng Storage được tạo ra, tùy thuộc vào danh sách các cặp key/value mà nó sẽ được định nghĩa là localStoragesessionStorage.

Web Socket
WebSoket là công nghệ hỗ trợ giao tiếp hai chiều giữa client và server bằng cách sử dụng một TCP socket để tạo một kết nối hiệu quả và ít tốn kém. Mặc dù được thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại ứng dụng nào.

cntt_anud2

Để xác nhận việc kết nối, client sẽ gửi một giá trị Sec-WebSocket-Key được mã hóa bằng Based64 đến server. Sau đó bên server sẽ gửi một Response lại cho client kèm với giá trị Sec-WebSocket-Accept (là kết quả sau khi thêm một chuỗi cố định, sau đó, mã hóa SHA-1 và Base64). Client sẽ kiểm tra status code (phải bằng 101) và Sec-WebSocket-Accept xem có đúng với kết quả mong đợi không và thực hiện kết nối. Kết nối này là “Full-Dupex TCP-Channel” (truyền song song).
Để thuận tiện trong việc sử dụng JavaScript triển khai WebSocket, người lập trình thường sử dụng NodeJS và thư viện Socket.io. Với 2 thành phần bổ sung này, việc xây dựng những ứng dụng với WebSocket trở nên dễ dàng và tiện lợi.

CORS
Trong HTML 5, một chính sách được thực thi trên trình duyệt và server nhằm hỗ trợ an ninh trong việc gửi request Cross domain với XMLHttpRequest. Nó được biết đến với cái tên là Cross Origin Resource Sharing-CORS. Với chính sách này, ứng dụng HTTP có thể gửi yêu cầu tài nguyên tới một domain khác thông qua các mã script. Quá trình thực thi được mô tả như sau:

 cntt_anud3

Việc kiểm tra hợp lệ dựa vào các header, trong Request:
Origin: http://api.origin.com
Và Response:
Access-Control-Allow-Origin: http://api.origin.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

Web SQL
Web SQL Database là một công nghệ kết hợp giữa trình duyệt và SQLite  để hỗ trợ việc tạo và quản lý database ở phía client. Các thao tác với database sẽ được thực hiện bởi javascript và sử dụng các câu lệnh SQL để truy vấn dữ liệu. Hiện tại Web SQL Database được hỗ trợ trong các trình duyệt Google Chrome, Opera và Safari.

 cntt_anud4

Web Message
Web Message là một phương pháp để chia sẻ dữ liệu giữa các trang web mà không để lộ DOM nhằm tránh bị lây nhiễm các mã độc hại thông qua chính sách cross-origin. Các phương thức thực hiện của Web Message: Cross-document messagingChannel messaging.
Crosss-document messaging thực hiện gửi dữ liệu bằng cách gọi các cú pháp như windows.postMessage() còn Channel messaging thì thực hiện việc gửi dữ liệu bằng MessageChannel.
Với những công nghệ mới giới thiệu trên đây, HTML5 thực sự hứa hẹn cho việc xây dựng những ứng dụng nền web phong phú, thỏa mãn các tiêu chí:
–                      Tính tiện dụng
–                      Khả năng hoạt động xuyên suốt giữa các trình duyệt
–                      Khả năng truy xuất rộng rãi
–                      Khả năng tương thích

Phần 2: Nguy cơ an ninh

Qua phần giới thiệu trên đây, ta thấy HTML5 có nhiều cải tiến về công nghệ, tuy vậy thật đáng tiếc là không có cải tiến kiến trúc nào cho việc hỗ trợ an ninh đặc biệt đối với các hướng tấn công thông dụng như: XSS, ClickJacking, CSRF,… thậm chí việc đặt JavaScript làm trọng tâm đã khiến cho sự nguy hiểm của tấn công XSS nguy hiểm hơn khi kết hợp với WebSocket, WebSQL…
Dựa vào thành phần và nguyên nhân gây lỗi, có 10 vector tấn công ứng dụng HTML 5 được phân chia vào 3 nhóm:

 cntt_anud5

Trong bài viết này, sau đây sẽ đề cập kỹ hơn đến những điểm mới trong thực hiện tấn công khai thác với XSS, CSRF trong ứng dụng HTML 5.

Tấn công CSRF vượt qua CORS
Chính sách trong CORS quy định việc gửi request cross domain với XHR thông qua các header điều khiển ‘origin’.
Với CORS, khi gửi request XHR tấn công CSRF sẽ mặc định không được gửi kèm cookie trong request. Để gửi kèm cookie ta phải sử dụng thuộc tính withCredentials thiết lập là true. Một chú ý khác là trong header request Content-type được set là ‘Text-plain’ khi đó Request sẽ được gửi trực tiếp mà không thiết lập là ‘OPTIONS/preflight’ để kiểm tra bên server. Nếu bên server có kiểm tra thiết lập Content-type là các loại khác như json thì request tấn công chưa có giải pháp thực hiện thành công.
Sau đây là ví dụ đoạn mã XHR tấn công CSRF:

cntt_anud6

Thêm vào đó, trong HTML 5, với cơ chế CORS việc upload file được thực hiện khá dễ dàng với XHR. Với XHR được nhúng trên trình duyệt HTML 5, có thể mở một socket “cross domain” và mang dữ liệu đi thông qua HTTP request. Việc lén upload file có thể thực hiện được nếu bên server không có cơ chế xác nhận token/captcha.

Khai thác XSS trong HTML 5
Song song với việc hỗ trợ các hàm API mới, điểm phong phú của HTML 5 còn ở chỗ nó hỗ trợ một số thẻ (tag) như audio/video, canvas, menu….hay một số thuộc tính (attributes) như form, submit…. Tất cả những điều này ngoài việc hỗ trợ cho việc lập trình web trên HTML 5 được đơn giản và thuận tiện nó còn bị attacker lợi dụng để bypass một số bộ lọc chống XSS thông dụng đã hoặc đang được sử dụng.
Với HTML 5, nó hỗ trợ thêm một số thẻ mới như <video>, <audio>. Những thẻ này giúp HTML 5 có thể chạy trực tiếp video hoặc audio mà không cần sử dụng phần mềm của hãng thứ 3 là flash như trên các phiên bản trước. Chính việc hỗ trợ thêm các thẻ mới đã tạo điều kiện cho attacker có thể vượt qua được các bộ lọc thẻ <script>, <img>… để tiêm các mã javascript vào trang web mà không cần phải sử dụng các tag như <script>, <img>….
Một số mã javascript được tiêm vào thông qua các tag media.
<video><source onerror=”javascript:alert(1)”>
<video onerror=”javascript:alert(1)”><source>
<audio onerror=”javascript:alert(1)”><source>
Với HTML5, việc bypass bộ lọc các ký tự ‘<’ và ‘>’ dễ dàng được thực hiện với attacker bằng cách chạy các đoạn javascript bằng nhập vào:
“onload=javascript:alert(1)
hay sử dụng một số thuộc tính mới trên HTML5 như:
“onforminput=alert(1), onformchange=alert(2),….
Thêm một cách khai thác XSS mới trong HTML 5 là sử dụng thuộc tính autofocus. Một số tag thường được sử dụng để khai thác như:
<input autofocus onfocus=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>

Các vector tấn công khác
Tận dụng sức mạnh của JavaScript và các công nghệ mới trong HTML5, kết hợp với một lỗ hổng XSS sẽ gây ra rất nhiều nguy cơ an ninh nguy hiểm cho ứng dụng web. Có thể kể đến như:
– Kết hợp với Web SQL: gây ra việc đánh cắp thông tin nhạy cảm thông qua việc truy xuất dữ liệu trên các DB SQL trình duyệt. Tùy theo chức năng của ứng dụng có thể tấn công leo thang ảnh hưởng đến dữ liệu trên server.
– Kết hợp với WebSocket: Quét mạng nội bộ, Botnet, Tạo ra Remote shell, đánh cắp thông tin và phiên làm việc của người dùng.
– Kết hợp với Web Worker: Tấn công DDOS
– Kết hợp với Web Storage: Đánh cắp hoặc thay đổi thông tin dữ liệu lưu trữ trên trình duyệt người dùng.
– Tấn công bypass sanbox trình duyệt
– ClickJacking, haijacking,…

Phần 3: Một số kết luận, khuyến cáo

Dù đã được các tổ chức thực hiện chuẩn hóa và đưa vào các trình duyệt thông dụng, nhưng HTML 5 vẫn là nền tảng mới cho ứng dụng nền web đang hoàn thiện. Cần thêm thời gian đễ các nhà phát triển trình duyệt tích hợp đầy đủ, hoàn thiện các công nghệ. Trong HTML 5, rất tiếc là không có sự thay đổi nào đáng kể trong cơ chế bảo vệ ứng dụng web, do vậy cần thiết phải nghiên cứu, đánh giá các nghuy cơ cũ và tìm hiểu các nguy cơ mới trên ứng dụng HTML 5.
Một số khuyến cáo đối với người xây dựng ứng dụng
–  Triển khai CORS policy chặt chẽ
–  Kiểm tra content-type trên server
–  Lọc đầu vào, đầu ra chống XSS
–  Không lưu thông tin nhạy cảm trên WebSQL và Web Storage