Kiểm tra ứng dụng trực tuyến Skipfish của Google

Một trong những ấn tượng đầu tiên về cỗ máy scanner Skipfish đối với các ứng dụng web của Google, bài viết được thực hiện bởi Felix “FX” Linder, người sáng lập Recurity Labs.


Theo bài viết trên blog bảo mật của Google được viết bởi Michal Zalewski – nhân viên phát triển, chức năng Skipfish miễn phí của Google được tạo ra để sử dụng nhanh chóng, dễ dàng kết hợp với các ứng dụng an ninh tiên tiến nhất. Khi thực hiện bài viết này, Felix 'FX' Lindner đã tiến hành so sánh Skipfish với các công cụ tương đương khác để kiểm tra tính tương thích và khả năng bảo đảm tính toàn vẹn của trang web.


Khi kiểm tra tính bảo mật của các ứng dụng web, các nhà phát triển thường xuyên sử dụng những bộ máy scanner với tính năng tự động để rà soát, đưa ra cái nhìn tổng quan, mà sau này có thể kiểm tra thêm bằng cách thủ công. Dựa vào chuyên môn và yêu cầu của người sử dụng, tính năng này có thể được sử dụng kèm với các công cụ khác như Nikto, hoặc phần mềm thương mại hóa toàn diện, ví dụ là Rational AppScan. Mục đích chính của chức năng này là rà soát toàn bộ cấu hình hệ thống, các thông số kỹ thuật cũng như sai sót trong quá trình tương tác giữa hệ thống web servers, application servers, application logics và các thành phần khác của những mô hình ứng dụng trực tuyến hiện đại ngày nay. Đa phần, các lỗi phát hiện được có liên quan đến lỗ hổng SQL injection, cross site scripting – XSS, các yêu cầu trang web giả mạo hoặc thực thi các đoạn mã độc.


Bức màn dần được kéo lên


Skipfish, vừa ra đời vào tháng 3 vừa rồi, có thể hỗ trợ hầu hết các tính năng cần có khi rà soát, kiểm tra 1 trang web bất kỳ nào đó: quản lý cookies, thực hiện chi tiết quá trình xác thực, nhận dạng tài khoản và giá trị các biến trong form mẫu HTML, thậm chí có thể sử dụng 1 session đơn để chuyển hướng đến trang chỉ định sẵn như 1 tài khoản đã được chứng thực. 1 khả năng đặc biệt khác của Skipfish là có thể “chạy” qua tất cả các file và thư mục để phát hiện các thành phần như đoạn mã sao lưu, phục hồi mà admin có thể bỏ sót, hỗ trợ tính năng nén file dành cho các ứng dụng web, hoặc cấu hình tập tin theo chuẩn SSH vô tình bị bỏ lại. Các hạng mục chỉ có thể được theo dõi, tải xuống theo kiểu trial hoặc error, bên cạnh đó, bộ máy scanner có thể kết hợp các định dạng file khác nhau với tên nhận dạng, qua đó kiểm tra tính xác thực qua đường dẫn tải xuống.


Ngoài ra, chương trình còn có khả năng thu thập 1 số từ khóa (có lẽ được lấy ra từ cơ chế tìm kiếm của Google) và sắp xếp theo thư mục và tên gọi. Skipfish đặc biệt đáng chú ý về mặt này vì chương trình sẽ thiết lập và kiểm tra tất cả các sự kết hợp có thể. Điều này có nghĩa mọi từ khóa sẽ được kết hợp với tất cả các đuôi mở rộng và các file có thực được lưu trữ trên hệ thống web server, và đương nhiên, kết quả tìm được sẽ được kiểm tra tên file, tên thư mục, cũng như yêu cầu HTTP POST. Cách làm tiếp cận này sẽ tạo ra số lượng rất lớn các sự kết hợp có thể được chứng minh. Rất may, Skipfish cung cấp thêm cơ chế từ điển định nghĩa trước với nhiều kích thước khác nhau, cho phép người dùng xác định đúng yêu cầu theo mức độ. Tuy nhiên, ngay cả mục từ điển tối thiểu yêu cầu bởi Zalewski cũng đã bao gồm 2,007 mục và sản sinh ra khoảng 42,000 yêu cầu cho mỗi thư mục lưu trữ được thử nghiệm.
Để có được ấn tượng riêng về Skipfish, nhóm tác giả đã có 1 thời gian ngắn để điều tra theo 1 số tình huống điển hình như: sử dụng Microsoft Internet Information Server 7.5 trong Windows 7 cùng với ScrewTurn Wiki 3.0.2 dành cho ASP.NET như công cụ tương tác với ứng dụng web. Hệ thống máy chủ Apache 2.2.3 dựa trên nền tảng Linux với các đoạn mã CGI truyền thống được viết bằng Perl. Máy in HP LaserJet cùng ChaiServer 3.0 cũng được sử dụng để gây ra nguyên nhân báo động nhầm và kết quá rà soát sai sự thật.


Áp dụng vào thực tế


Hiện tại, Skipfish đã có sẵn phiên bản mã nguồn và phải được biên dịch để ứng dụng vào nền tảng hệ thống. Bộ mã này yêu cầu thư viện libidn để mã hóa và giải mã thông số Internationalised Domain Names (IDN) để cài đặt, ví dụ trong Ubuntu 9.10 điều này dễ dàng thực hiện bởi câu lệnh sudo apt-get install libidn11-dev trong cửa sổ Terminal. Sau khi biên dịch thành công mã nguồn, người dùng lựa chọn thư mục từ thư mục con lưu trữ từ điển và copy vào thư mục chứa file nhị phân Skipfish như skipfish.wl. Ngoài ra, đường dẫn lưu trữ cũng có thể được lựa chọn sau. Lưu ý rằng Skipfish sẽ tự động mở rộng file trong thư mục này, vì vậy người dùng luôn được khuyến khích sử dụng 1 bản sao có sẵn.
Sử dụng câu lệnh ./skipfish -o example-log http://www.example.com/ để khởi động quá trình rà soát server và thay thế bản báo cáo trong thư mục example-log sau khi quá trình này kết thúc. Để thiết lập thuộc tính kiểm tra blog áp dụng vào thư mục con trên server, sử dụng câu lệnh sau ./skipfish -I /blog -o blog-report http://www.example.com/blog

googlek__02

Skipfish sẽ sản sinh ra số lượng rất lớn các yêu cầu được xử lý trong khoảng thời gian rất ngắn. Trong lần hoạt động đầu tiên qua hệ thống nội bộ Gigabit Ethernet để “chống lại” hệ thống được trang bị đầy đủ, chương trình đạt được 2796 yêu cầu HTTP mỗi giây. Ngay lập tức, nó đã đẩy mức hoạt động của nhân CPU lên tới 100%. Mặc dù TCP/IP của Linux có thể kiểm soát tốt quá trình này bằng cách huy động, sử dụng tất cả tài nguyên có sẵn, bạn có thể nhận thấy sự khác biệt khi nhìn vào lượng dữ liệu netstat được trả lại.


Một khi quá trình rà soát được kích hoạt, Skipfish sẽ không thể xác định chính xác cần bao lâu để hoàn thành. Trong bài thử nghiệm này mất tới hơn 4 giờ đồng hồ để kết thúc, chương trình đã chuyển 68GB dữ liệu và 40 triệu yêu cầu HTTP, và 1 nhân CPU hoạt động gần như hết công suất trong suốt quá trình, nhưng Skipfish lại chỉ sử dụng 140MB bộ nhớ hệ thống khi kết hợp khoảng 1,195 files trong 43 thư mục. So với cùng thời điểm, ứng dụng IIS đã “vắt kiệt” công suất của 2 nhân Intel XEON 2.5GHz và 100MB đến 500MB bộ nhớ thực, và tạo ra file log có dung lượng 1.5GB với chế độ thiết lập mặc định.

 

Giải thích

Trong cuộc thử nghiệm, đội kỹ thuật đã vô hiệu hóa chức năng từ điển để kiểm tra hệ thống Apache web server. Tuy nhiên, Skipfish vẫn có thể “học” các từ mới trong quá trình kiểm tra, mà sau đó sản sinh ra thêm 304 mục mới. Điều này rút ngắn quá trình đi 20 phút, trong toàn bộ 300,000 yêu cầu HTTP được tạo ra, và tạo ra 232MB lưu lượng dữ liệu trong hệ thống mạng.
Skipfish thường xuyên sản sinh lượng kết quả rất lớn và lưu trữ trong thư mục chỉ định trước dưới dạng HTML, JavaScript cùng JSON và dữ liệu raw. Sau đó, người sử dụng có thể xem bản báo cáo trong trình duyệt hỗ trợ JavaScript và đánh giá toàn bộ dữ liệu. Thật không may, số lượng cảnh báo nhầm là khá cao so với lượng sinh ra bởi các công cụ khác như Nikto hoặc Burp Suite, mà tác giả dùng để so sánh. Ví dụ: một số file text chuẩn ASCII được dịch ra những tín hiệu JSON phản hồi không đi kèm với tính năng bảo mật XSSI (Cross Site Script Inclusion). Skipfish sẽ coi trọng đặc biệt những tín hiệu đi kèm được điền sẵn vào mẫu theo kiểu MIME và các ký tự khác để phản hồi lại tín hiệu từ server. Mỗi chi tiết chênh lệch nào đó cũng có thể gây ra rủi ro, và mức độ của những lỗi này là không thể lường trước được.
Skipfish không nổi trội về khả năng liệt kê nội dung thư mục đối với các mục đích kiểm tra trong bài thử nghiệm này. Nội dung file robots.txt, có thể đặc biệt quan trọng với việc nhận dạng các khu vực hoạt động của hệ thống máy chủ, lại bị bỏ lại và không báo cáo thuộc dạng interesting file đối với người dùng trong bảng báo cáo kết quả.


Hạ màn

Trong suốt 4 giờ quét với IIS 7.5 cùng ScrewTurn wiki mang lại 8 kết quả với độ rủi ro cao, 264 kết quả bình thường và 55 kết quả thấp, 123 cảnh cáo cùng 254 thông tin về các mục. Tổng cộng dung lượng dữ liệu lưu trữ trên ổ đĩa là 851MB, và trình duyệt web nên có bộ nhớ hệ thống khoảng 1Gb để có thể xem được trang kết quả.

googlek__03

Không may mắn rằng, 8 kết quả quan trọng nhất, được báo cáo liên quan đến lỗi tràn bộ nhớ đệm do ký tự số nguyên dương gây ra trong HTTP-GET, lại là sai. Trong nhóm kết quả tiếp theo, Interesting Server responses là lỗi HTTP 404 (resource not found) và HTTP 500 (internal server error) đều bị gộp lại với nhau, và rất cần thiết để hiển thị từng kết quả trong tổng số 130. Kể từ khi IIS hiển thị thông báo lỗi HTTP 500 để tránh việc tấn công trực tiếp vào cơ sở dữ liệu, các yêu cầu còn lại sẽ được đồng bộ hóa để tương ứng với dữ liệu trang web lưu trữ trên máy chủ. Tuy nhiên, nhìn vào file log dữ liệu từ máy chủ cho thấy những hoạt động và nỗ lực từ trước là lãng phí vì những lỗi này luôn luôn hiển thị giống nhau và không có sự liên quan nào đến bảo mật an ninh. Những báo động giả trên cũng không là ngoại lệ khi những phân tích tiếp theo được tiến hành đã phát hiện ra lỗ hổng hệ thống Typo3 được Skipfish phát hiện về lỗi SQL injection nghiêm trọng.


Bên cạnh đó, Skipfish đáng chú ý khi phát hiện đầy đủ hệ thống phòng chống xâm nhập Intrusion Prevention System (IPS) và liệt kê trong danh sách Internal Warnings. Trong cuộc thử nghiệm này, chương trình đã phát hiện ra lỗi HttpRequestValidationException, gây ra bởi ASP.NET cùng với SQL injection và các cuộc tấn công cross-site scripting – XSS. Và điều này sẽ gây ra lỗi HTTP 500.


Thử nghiệm

Trong toàn bộ quá trình, kết quả Skipfish đưa ra khi tiến hành rà soát IIS 7.5 và kết hợp ScrewTurn không quá ấn tượng. Tuy nhiên, nó lại chỉ ra rằng tính năng từ điển hóa của bộ máy scan có thể tự phát hiện /wiki/ URI, và cho phép kiểm tra URI mà không cần thêm bất cứ sự can thiệp thủ công nào.


Ngoài ra, khi tiến hành kiểm tra với hệ thống máy chủ Apache và các đoạn mã CGI, giới hạn chức năng từ điển chuyển thành học tập, thì điểm số của Skipfish có khá hơn 1 chút. Chỉ có 47 lỗi ở mức trung bình, 6 lỗi thấp, 1 cảnh báo và 65 thông tin về các mục, chỉ tốn 83Mb dung lượng. Thật thú vị, Skipfish không còn khả năng xử lý các form mẫu HTML được sinh ra bởi Perl cổ điển, và kết quả là ứng dụng không thu thập bất cứ từ khóa nào điền vào các mẫu có sẵn để thử nghiệm. Tuy nhiên, bộ máy scanner đã phát hiện chính xác các form mẫu không có biện pháp an ninh chống lại các cuộc tấn công Cross Site Request Forgery (CSRF) nào cả.
Cả 2 mục Interesting File và Incorrect or missing MIME type đều liệt kê ra các đường dẫn URL mà lỗ hổng trong thiết lập từ hệ thống server hiển thị đầy đủ mã nguồn của CGI chứ không phải là mã biên dịch ra bởi CGI. Kết quả này có được khi kết hợp tên file và phần đuôi mở rộng.


Một cách ngẫu nhiên, quá trình rà soát với thiết bị máy in không đưa ra bất cứ kết quả nào vì tác giả buộc phải hủy bỏ giữa chừng sau 18 giờ hoạt động mà không có tín hiệu khả quan nào. Và trong tình huống tương tự như vậy, đây là 1 sự bất tiện khi Skipfish chỉ đưa ra báo cáo về những gì chương trình phát hiện được khi quá trình rà soát hoàn thành, hoặc hủy bỏ bởi lệnh Control-C. Và không có cách nào để tìm ra các công cụ đã được sử dụng trong khi quá trình kiểm tra đang thực hiện.

 

Đánh giá

Skipfish tỏ ra vượt trội khi khám phá ra các dữ liệu bị “bỏ quên” và phát hiện các hành vi, hoạt động bất ngờ xảy ra trong hệ thống. Sự hoán vị thay đổi các từ khóa và phần mở rộng khá giống với quá trình xử lý ngẫu nhiên, và sản sinh ra lượng kết quả tương đương, cùng với khối lượng dữ liệu.
Đối với những hệ thống máy tính khổng lồ, ví dụ như của Google, trong điều kiện làm việc không đồng nhất của các ứng dụng web và phải truy cập đến những nguồn tài nguyên gần như không giới hạn, cùng với lưu lượng băng thông, việc sử dụng Skipfish dưới hình thức hiện tại là 1 biện pháp ràng buộc và rất hữu ích để khám phá những chức năng và nội dung bất ngờ cũng như không mong muốn.
Tuy nhiên, việc sử dụng Skipfish sẽ khiến cho cảm giác truy cập trực tiếp đến file hệ thống của web server ít hơn hẳn, đặc biệt khi tiến hành quét qua kết nối Internet. Lượng dữ liệu lưu chuyển bởi ứng dụng tương đương với số lượng thực của file hệ thống.

googlek__04

Form mẫu hiện tại của Skipfish giới hạn khá nhiều với mục đích sử dụng chuyên nghiệp. Điều tra kết quả thu thập, tính năng này luôn luôn cần thiết, sẽ nhanh chóng trở thành nhiệm vụ quan trọng trong báo cáo. Hơn nữa, những báo cáo kết quả như Incorrect or missing charset, Incorrect caching directives hoặc Incorrect or missing MIME type… dường như quá trừu tượng và xa vời. Ngay cả với những người tester có kinh nghiệm cũng phải tìm kiếm thêm thông tin để tìm ra nguyên nhân thực sự. Do đó, việc ứng dụng Skipfish với những người ít kinh nghiệm là điều không nên vì tâm lý không chắc chắn cùng với khả năng rủi ro là tương đối cao.


Trong nhiều trường hợp, việc sử dụng chức năng từ điển của Skipfish sẽ bị cấm vì lượng dữ liệu sản sinh ra và báo cáo kết quả hệ thống được tạo ra. Một hệ thống ứng dụng kinh doanh dựa trên nền tảng Java có thể không phù hợp với bộ máy Skipfish cùng chức năng từ điển thiết lập ở mức tối thiểu vì tài nguyên hệ thống, CPU và bộ nhớ thực nhiều khả năng sẽ “tê liệt” trước khi quá trình rà soát kết thúc. Chế độ tường lửa, các module kiểm tra phức tạp và hệ thống IDS/IPS cũng dần trở nên “đuối” khi số lượng tin nhắn từ phía client cực kỳ lớn, hoặc đơn giản hơn là tắt bỏ các chức năng trên.

T.Anh (theo H-online)