[Serious Security Bug] Cách xử lý lỗ hổng CVE-2015-7547 liên quan đến glibc
CVE
1
Security
31
White

huydx viết ngày 17/02/2016

Background

Hôm nay những người làm security ở google vừa phát hiện được một lỗ hổng khá nặng nề trên glibc (một thư viện dùng làm nền tảng cho rất nhiều các thư viện cơ bản khác). Các bạn có thể tham khảo thêm các link dưới đây

Về cơ bản thì nội dung bug này là khi sử dụng hàm getaddrinfo để resolve địa chỉ từ dns thì có nếu DNS response có ác ý thì có thể exploit hệ thống. Tức là tất cả những hệ thống thông qua internet để làm gì đó, về cơ bản là có thể bị exploit.

Thế nên xin vô cùng chia buồn với những bạn nào làm sysadmin mà hệ thống có vài trăm server là các bạn sẽ phải thức để để patch đó :(

Cách xử lý 1 (official style)

  • Các distribution lớn chắc đã có bản vá, down về vá thôi :D
  • Tuy nhiên update glibc (thư viện link tĩnh) đồng nghĩa với việc phải restart process, thế nên để nhanh nhất thì bạn nên ... restart lại OS

Cách xử lý 2 (non-official style)

Có những hệ thống mà chắc việc restart là bất khả thi, ví dụ như DB server hay là NFS server. Với những trường hợp này thì ngoài việc restart có một hướng xử lý khác là sử dụng iptables. Có một điểm thú vị ở exploit này là chỉ xảy ra với packetsize có độ dài lớn hơn 2048 bytes. Vậy thế nên chúng ta có thể xử lý theo hướng là

Drop tất cả các response từ DNS (cả TCP và UDP) mà có độ dài lớn hơn 2048 bytes.

Thông thường thì packet từ DNS server sẽ có độ dài < 2kb (UDP package cũng thường bị giới hạn là < 512byte nên chắc là ok). Ngoài ra thì có trường hợp có thể nghĩ đến là DNSSEC hay là truyền tin dưới dạng AXFR, nhưng chắc cũng chỉ có vài case đó.

Setting iptables (trong trường hợp hệ thống sử dụng iptables)

sudo iptables -I INPUT -p udp --sport 53 -m length --length 2048: -j DROP
sudo iptables -I INPUT -p tcp --sport 53 -m length --length 2048: -j DROP
sudo ip6tables -I INPUT -p udp --sport 53 -m length --length 2048: -j DROP
sudo ip6tables -I INPUT -p tcp --sport 53 -m length --length 2048: -j DROP
/etc/sysconfig/iptables,ip6tables

-I INPUT -p udp --sport 53 -m length --length 2048: -j DROP
-I INPUT -p tcp --sport 53 -m length --length 2048: -j DROP
///*** tất cả file trong /etc/sysconfig/iptables,ip6tables đều set như dưới đây ***//


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p udp --sport 53 -m length --length 2048: -j DROP
-A INPUT -p tcp --sport 53 -m length --length 2048: -j DROP
COMMIT

Cuối cùng chỉ cần

service iptables restart; service ip6tables restart

là ok

Setting firewalld (ví dụ như trong Centos 7)

Thông thường thì iptables và firewalld không sử dụng cùng một lúc với nhau nên với những hệ thống dùng firewalld thì sẽ xử lý như dưới đây:

sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p udp --sport 53 -m length --length 2048: -j DROP
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --sport 53 -m length --length 2048: -j DROP
sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p udp --sport 53 -m length --length 2048: -j DROP
sudo firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --sport 53 -m length --length 2048: -j DROP
sudo firewall-cmd --reload

Nếu bạn sử dụng length module thì sẽ không chỉ đơn giản add-rule là được. Trong TH đó thì bạn sử dụng --direct để thêm option vào dưới dạng cú pháp của iptables như trên.
Do sử dụng flag --permanent nên để phản ánh vào hệ thống đang chạy thì bạn cần restart lại firewalld bằng firewall-cmd --reload

Sau khi bạn đánh những câu lệnh trên thì những rule dưới đây sẽ tự động được thêm vào /etc/firewall/direct.xml

/etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
  <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p udp --sport 53 -m length --length 2048: -j DROP</rule>
  <rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp --sport 53 -m length --length 2048: -j DROP</rule>
  <rule priority="0" table="filter" ipv="ipv6" chain="INPUT">-p udp --sport 53 -m length --length 2048: -j DROP</rule>
  <rule priority="0" table="filter" ipv="ipv6" chain="INPUT">-p tcp --sport 53 -m length --length 2048: -j DROP</rule>
</direct>

Kết luận

Nói chung thì cách non-official chỉ là một cách giải quyết tạm thời thôi. Để giải quyết dứt điểm thì bạn vẫn nên update glibc và restart hệ thống :D.
Good luck cho tất cả các bạn sysadmin :D.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
942 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
148 14
White
118 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
95 10
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
942 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!