Thứ hai, 18/07/2016 | 00:00 GMT+7

Cách bảo vệ server của bạn chống lại lỗ hổng HTTPoxy


HTTPoxy là gì?

Vào ngày 18 tháng 7 năm 2016, một lỗ hổng ứng dụng CGI, được gọi là HTTPoxy , đã được tiết lộ. Kẻ tấn công có thể khai thác các triển khai dễ bị tấn công bằng cách chuyển một tiêu đề HTTP Proxy với yêu cầu của chúng, điều này sẽ thay đổi URL được ứng dụng sử dụng khi liên hệ với các dịch vụ backup . Điều này được dùng để làm rò rỉ thông tin đăng nhập, sửa đổi phản hồi cho ứng dụng, v.v.

Lỗ hổng bảo mật là do xung đột tên giữa biến môi trường HTTP_PROXY , thường được sử dụng để chỉ định vị trí của dịch vụ proxy backend và tiêu đề client Proxy HTTP. Đặc tả CGI gọi các tiêu đề do khách hàng cung cấp được chuyển tới môi trường với tiền tố HTTP_ cho không gian tên. Sự HTTP_ này xung đột với các biến cấu hình như HTTP_PROXY , cũng bắt đầu bằng HTTP_ . Nếu một ứng dụng CGI hoặc một thư viện sử dụng biến này mà không cần xử lý thêm, nó có thể kết thúc bằng cách sử dụng giá trị do client cung cấp khi cố gắng kết nối với dịch vụ proxy.

Do lỗ hổng này ảnh hưởng đến nhiều cách triển khai giống như CGI, một số mã nhận dạng lỗ hổng bảo mật đã được tạo: CVE-2016-5386 , CVE-2016-5386 , CVE-2016-5387 , CVE-2016-5388 , CVE-2016- 1000109CVE-2016-1000110 (Tại thời điểm viết bài này, chúng được bảo lưu, nhưng không được điền).

Lỗ hổng HTTPoxy đã được biết đến dưới một số hình thức từ năm 2001, nhưng chưa bao giờ được công nhận là một vấn đề phổ biến cho đến gần đây. Mặc dù nó có thể ảnh hưởng đến nhiều triển khai, nhưng việc giảm thiểu khá đơn giản và dễ hiểu.

Server và ứng dụng rủi ro bảo mật

HTTPoxy là một lỗ hổng chung được tìm thấy bởi nhiều triển khai CGI. Một ứng dụng hoặc server có thể triển khai chính xác đặc tả CGI nhưng vẫn dễ bị tấn công.

Để triển khai dễ bị tấn công, nó phải:

  • Sử dụng biến môi trường HTTP_PROXY để cấu hình kết nối proxy : Trong chính mã ứng dụng hoặc bất kỳ thư viện nào được sử dụng đòn bẩy. Đây là một phương pháp khá tiêu chuẩn để cấu hình server proxy bằng cách sử dụng môi trường.
  • Thực hiện yêu cầu đối với các dịch vụ backend bằng HTTP : Vì xung đột tên là cụ thể cho tiền tố HTTP_ , chỉ các yêu cầu do ứng dụng thực hiện bằng HTTP mới bị ảnh hưởng. Các yêu cầu sử dụng HTTPS hoặc bất kỳ giao thức nào khác không dễ bị tấn công.
  • Hoạt động trong môi trường giống CGI hoặc CGI : Các triển khai trong đó tiêu đề client được dịch sang các biến môi trường có tiền tố HTTP_ rất dễ bị tấn công. Bất kỳ triển khai tuân theo nào của CGI hoặc các giao thức liên quan như FastCGI sẽ thực hiện điều này.

Như bạn thấy , sự kết hợp của các yếu tố triển khai và ứng dụng cụ thể là cần thiết để việc triển khai rủi ro bảo mật . Để kiểm tra xem việc triển khai của bạn có bị ảnh hưởng hay không, Luke Rehmann đã tạo một trang web đơn giản để kiểm tra các trang web có thể truy cập để tìm lỗ hổng .

Thông tin cụ thể về ngôn ngữ

Các ứng dụng PHP nói riêng nên được kiểm tra, vì các triển khai giống như CGI phổ biến hơn nhiều trong hệ sinh thái PHP so với các ngôn ngữ khác. Hơn nữa, việc sử dụng rộng rãi phương thức getenv trong các thư viện phổ biến làm tăng vấn đề này, vì không rõ ràng rằng điều này sẽ trả về đầu vào của user không được bảo vệ chứ không chỉ các biến cấu hình. Các thư viện cụ thể hiện đang bị ảnh hưởng là Guzzle (phiên bản 4.0.0rc2 trở lên), Artax và lớp StreamContextBuilder của composer .

Các ngôn ngữ khác được phát hiện là dễ bị tấn công khi triển khai bằng CGI là Python và Go. Các ngôn ngữ này được triển khai phổ biến hơn bằng các phương pháp khác, không dễ bị tấn công. Tuy nhiên, nếu CGI được sử dụng, các thư viện đọc biến HTTP_PROXY mà không sửa đổi hành vi của chúng sẽ dễ bị tấn công.

Làm thế nào để đánh bại lỗ hổng bảo mật

May mắn là HTTPoxy tương đối đơn giản để sửa chữa. Lỗ hổng bảo mật có thể được giải quyết từ lớp web server hoặc ứng dụng hoặc thư viện:

  • Các ứng dụng hoặc thư viện có thể bỏ qua biến HTTP_PROXY khi chúng ở trong môi trường CGI.
  • Các ứng dụng hoặc thư viện có thể sử dụng một biến môi trường khác để cấu hình kết nối proxy
  • Web server hoặc proxy có thể bỏ đặt tiêu đề Proxy nhận được trong các yêu cầu của client

Nếu bạn đang sử dụng một thư viện dễ bị tấn công, bạn nên giảm thiểu mối đe dọa trên server cho đến khi có sẵn các bản vá để giải quyết vấn đề. Nếu bạn là tác giả thư viện hoặc ứng dụng và dự án của bạn dựa vào biến HTTP_PROXY để cấu hình phần backend proxy, hãy xem xét sử dụng một biến thay thế sẽ không xung đột khi chạy trong môi trường giống như CGI. Ruby và một số dự án khác sử dụng CGI_HTTP_PROXY cho mục đích này.

Vì tiêu đề Proxy không phải là tiêu đề HTTP tiêu chuẩn nên nó có thể được bỏ qua một cách an toàn trong hầu hết các trường hợp. Điều này có thể được thực hiện trong web server hoặc bộ cân bằng tải được sử dụng để hướng các yêu cầu đến chính ứng dụng. Vì tiêu đề Proxy HTTP không có bất kỳ mục đích hợp lệ tiêu chuẩn nào, nên nó hầu như luôn có thể bị loại bỏ.

Bất kỳ web server , bộ cân bằng tải hoặc proxy thông thường nào đều có thể không đặt tiêu đề thích hợp.

Xóa tiêu đề proxy HTTP bằng Apache

Nếu bạn đang chạy web server Apache HTTP, module mod_headers được dùng để bỏ đặt tiêu đề cho tất cả các yêu cầu.

Server Ubuntu và Debian

Để bật mod_headers trong server Ubuntu hoặc Debian, hãy nhập:

  • sudo a2enmod headers

Sau đó, mở file cấu hình chung:

  • sudo nano /etc/apache2/apache2.conf

Ở phía dưới, hãy thêm:

/etc/apache2/apache2.conf
. . .
RequestHeader unset Proxy early

Lưu và đóng file .

Kiểm tra cấu hình để biết lỗi cú pháp:

  • sudo apache2ctl configtest

Khởi động lại dịch vụ nếu không có lỗi cú pháp nào được báo cáo:

  • sudo service apache2 restart

Server CentOS và Fedora

Mô-đun mod_headers nên được bật theo mặc định cho các cài đặt thông thường. Để bỏ đặt tiêu đề Proxy , hãy mở file cấu hình chung:

  • sudo nano /etc/httpd/conf/httpd.conf

Ở phía dưới, hãy thêm:

/etc/httpd/conf/httpd.conf
. . .
RequestHeader unset Proxy early

Lưu file khi bạn hoàn tất.

Kiểm tra lỗi cú pháp bằng lệnh :

  • sudo apachectl configtest

Nếu không có lỗi cú pháp nào được báo cáo, hãy khởi động lại dịch vụ bằng lệnh :

  • sudo service httpd restart

Xóa tiêu đề proxy HTTP bằng Nginx

Trong Nginx, việc giảm thiểu cũng rất nhỏ. Bạn có thể dễ dàng làm sạch môi trường cho bất kỳ môi trường giống như CGI nào đang chạy trên server hoặc ngược dòng.

Server Ubuntu và Debian

Trên server Ubuntu và Debian, thông số FastCGI thường được bao gồm từ fastcgi_params hoặc fastcgi.conf khi cài đặt proxy FastCGI. Bạn có thể hủy đặt tiêu đề HTTP_PROXY trong cả hai file này:

  • echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
  • echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params

Nếu bạn không tìm nguồn cung cấp một trong các file khi cấu hình proxy FastCGI của bạn , hãy đảm bảo bao gồm cùng dòng này trong chính vị trí proxy:

/etc/nginx/sites-enabled/some_site.conf
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

Nếu bạn đang sử dụng Nginx cho proxy HTTP thông thường, bạn cũng nên xóa tiêu đề HTTP Proxy . Tiêu đề proxy HTTP được đặt trong file /etc/nginx/proxy_params . Bạn có thể thêm luật để bỏ đặt tiêu đề Proxy cho file đó bằng lệnh :

  • echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params

, nếu bạn không tìm nguồn cung cấp file này từ bên trong cấu hình khối server của bạn , bạn sẽ phải thêm nó vào chính vị trí proxy:

/etc/nginx/sites-enabled/some_site.conf
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

Kiểm tra lỗi cú pháp bằng lệnh :

  • sudo nginx -t

Nếu không có lỗi nào được báo cáo, hãy khởi động lại dịch vụ:

  • sudo service nginx restart

Server CentOS và Fedora

Nginx trên CentOS và Fedora cũng sử dụng cùng các fastcgi_paramsfastcgi.conf để cấu hình proxy FastCGI. Bỏ đặt tiêu đề HTTP_PROXY trong cả hai file này bằng lệnh :

  • echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
  • echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params

Nếu bạn không tìm nguồn cung cấp một trong những file này khi cấu hình proxy FastCGI của bạn , hãy đảm bảo bao gồm cùng dòng này trong chính vị trí proxy:

/etc/nginx/nginx.conf
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

Nếu bạn đang sử dụng Nginx cho proxy HTTP thông thường, bạn cũng nên xóa tiêu đề HTTP Proxy . Bạn chỉ cần thêm luật để bỏ đặt tiêu đề Proxy ở bất kỳ vị trí nào mà bạn đang thực hiện proxy_pass . Nếu bạn không chắc proxy_pass đang được sử dụng ở đâu, bạn có thể dễ dàng tìm kiếm folder cấu hình của bạn :

  • grep -r "proxy_pass" /etc/nginx
Output
/etc/nginx/nginx.conf.default: # proxy_pass http://127.0.0.1;

Bất kỳ kết quả nào không được comment (như ví dụ trên) nên được chỉnh sửa để bao gồm proxy_set_header Proxy ""; :

/etc/nginx/nginx.conf
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

Kiểm tra lỗi cú pháp bằng lệnh :

  • sudo nginx -t

Nếu không có lỗi nào được báo cáo, hãy khởi động lại dịch vụ:

  • sudo service nginx restart

Xóa tiêu đề proxy HTTP bằng HAProxy

Nếu bạn đang sử dụng HAProxy để chuyển hướng lưu lượng đến các server ứng dụng của bạn , bạn có thể bỏ tiêu đề Proxy trước khi chuyển tiếp lưu lượng.

Mở file /etc/haproxy/haproxy.cfg để chỉnh sửa:

  • sudo nano /etc/haproxy/haproxy.cfg

Bạn có thể đặt chỉ thị http-request trong phần frontend , backend hoặc phần listen của cấu hình của bạn.

/etc/haproxy/haproxy.cfg
frontend www
    http-request del-header Proxy
    . . .

backend web-backend
    http-request del-header Proxy
    . . .

listen appname 0.0.0.0:80
    http-request del-header Proxy
    . . .

Chúng không cần phải được đặt trong mỗi phần, nhưng sẽ không có hại gì nếu bao gồm chúng. Lưu file khi bạn hoàn tất.

Kiểm tra cú pháp bằng lệnh :

  • sudo haproxy -c -f /etc/haproxy/haproxy.cfg

Nếu không tìm thấy sự cố nào, hãy khởi động lại dịch vụ bằng lệnh :

  • sudo service haproxy restart

Kết luận

Lỗ hổng HTTPoxy đã xuất hiện khá lâu và có thể ảnh hưởng đến một lượng lớn các ứng dụng được triển khai trên web. May mắn là có thể dễ dàng sửa chữa bằng cách sử dụng các khả năng thay đổi tiêu đề có nguồn root từ bất kỳ web server nào.


Tags:

Các tin liên quan

Cách phân vùng và định dạng thiết bị lưu trữ trong Linux
2016-07-13
Cách thực hiện các tác vụ quản trị cơ bản cho thiết bị lưu trữ trong Linux
2016-07-13
Giới thiệu về thuật ngữ và khái niệm lưu trữ trong Linux
2016-07-13
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 16.04
2016-05-09
cách cấu hình bind làm server lưu trữ hoặc chuyển tiếp DNS trên Ubuntu 16.04
2016-05-02
Cách cài đặt và cấu hình Postfix làm server SMTP chỉ gửi trên Ubuntu 16.04
2016-04-29
Cách lưu trữ server chia sẻ tệp bằng Pydio trên Ubuntu 14.04
2016-04-29
Thiết lập server ban đầu với Ubuntu 16.04
2016-04-21
Cách cài đặt Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 16.04
2016-04-21
Cách cài đặt Linux, Nginx, MySQL, PHP ( LEMP) trong Ubuntu 16.04
2016-04-21