Tải bản đầy đủ (.pdf) (8 trang)

Lỗi do tràn bộ nhớ đệm và cách khắc phục pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (271.92 KB, 8 trang )

Lỗi do tràn bộ nhớ đệm và cách
khắc phục
Về cơ bản, tràn bộ nhớ đệm thường xuất phát từ một nguyên nhân duy
nhất. Đó là do người dùng gửi quá nhiều dữ liệu tới một chương trình và một
phần của dữ liệu này buộc phải lưu trữ ra ngoài bộ nhớ mà lập trình viên đã
cấp cho chương trình đó. Quá trình tràn bộ nhớ đệm có thể gây ra nhiều vấn
đề, trong đó có một vấn đề mà chúng ta cần quan tâm đó là khi bộ nhớ đệm
lưu trữ dữ liệu tới một mức độ nhất định nào đó thì tin tặc có thể chạy các
đoạn mã chương trình trên hệ thống.
Trongbài viết này chúngta sẽ tìm hiểu một tình huốngtràn bộ nhớ đệmmàtin tặc
có thể khai thác để chạy mã trên hệ thống. Sauđó chúng ta sẽ tìm hiểu Data
Execution Preventions(DEP),một tính năng đượctích hợp trong hệ điều hành
Windows có chức năngngăntràn bộ nhớ đệm.
Nhận biết hiện tượng tràn bộ nhớ đệm
Để có thể hiểu rõvề hiện tượng tràn bộ nhớ đệm chúng ta phải nắm vững ngôn
ngữ lập trìnhcao cấp như C hay C++,cũngnhư cómộtvốn kiến thứcsâuvề quá
trìnhvận hành của các ngăn xếp bộ nhớ.
Khi viết mộtchươngtrình,một trongnhững điều mà lậptrình viên cần phải tính
toáncẩn trọng đó là kíchthướcvùng trống của bộ đệm được phânbổ cho những
hàm cụ thể. Bộ nhớ đệm là một vùng trống liền kề của bộ nhớ màmộtchương
trìnhcó thể sử dụngđể lưu trữ dữ liệu mà các chức năng khác có thể sử dụng.
Chúng tahãy xem xét đoanmãví dụ sau:
Hình 1: Hàm A C rất dễ bị tấn công khi tràn bộ nhớ đệm.
Hàm này rất rõ ràng, bắtđầu bằngviệc khaibào hai biếnbufferA vàbufferB có kích
thướclầnlượt là 50 và16. Chươngtrình nàyhiển thị một câu hỏi tới người dùng
yêu cầu nhậptên và sử dụng hàm gets đễnnhận thông tinnhập vào.Sauđó dữ liệu
mà người dùng cungcấp được copytừ bufferA sang tham số bộ nhớ đệmvà hàm
này được hoànthành.
Với một chương trình đơn giản như vậy cóthể hơi quá khi chorằng nó có thể bị
tác động bởi mọi cuộc tấn công. Tuy nhiên vấnđề ở đây nằmtrong hàm gets. Vì
hàm gets không tự kiểm tra giới hạn do đó khó có thể khẳng địnhrằng thôngtin


nhập vào bufferA khôngvượtquá 50 kí tự. Nếu người dùng nhập hơn 50 kí tự thì
chương trình sẽ bị sập.
Hàm strcopy sẽ copy dữ liệu trongbufferA sangbufferB.Tuy nhiên bufferB có kích
thướcnhỏ hơn bufferA, điều này có nghĩa là dù người dùng nhậpvào ít hơn 50 kí
tự nhưng vẫn có thể nhiều hơn 16 kí tự vào bufferA, và khicopy sangbufferB sẽ
gây ra hiện tượngtràn bộ nhớ đệmvà chương trình cũngsẽ bị sập. Chương trình
nhỏ này không chỉ cómột mà là hai lỗ hổng trànbộ nhớ đệm.
Khai thác tràn bộ nhớ
Tiếp theochúng ta sẽ tìmhiểu nhữngđiều kiện gây ra tràn bộ nhớ và vấnđề phát
sinh từ tràn bộ nhớ? Trongnhữngtrườnghợp bộ nhớ đệm bị trànthìdữ liệu tràn
ra ngoài bộ nhớ đệm đượcchỉ địnhsẽ phải lưu trữ vàomộtnơi khác. Dữ liệu này
sẽ chảy vàocác vùng nhớ lân cận, vàthông thườngkhiđó chương trình sẽ bị lỗi vì
nó khôngthể xử lý các dữ liệu bổ sung.Mặt khác, khi lỗi này bị mộtai đó hiểu biết
về ngôn ngữ Assembly (một bộ ngôn ngữ lậptrình cấpthấp được sử dụng trong
lập trình máytính, vi xử lý, vi điều khiển và mạch tích hợp) vàngăn xếp bộ nhớ
khai thác thì mọi chuyện còn tồi tệ hơn. Trongtìnhhuốngnày, tin tặc có thể gây
tràn bộ nhớ đệm theo phươngpháp màchúng cóthể tạo những lệnhhệ thống
riêng, rồi chuyển đổi những lệnhnày thành mã byte cấp thấp sau đó gửi chúng tới
chương trình này theođịnhdạng phù hợp thì những lệnhnày sẽ được chạy.
Hình 2: Một mẫu Shellcode của Assembly và C được viết để trả về
một dấu nhắc C:\ của Windows.
Lúc này đoạnmã được chạy trong ngữ cảnh ứng dụng dễ bị tấn công banđầucủa
người dùng. Điều đó có nghĩalà nếu chương trìnhnày đượcquản trị hệ thống chạy
thì mãkết hợp cũngchạytrong ngữ cảnhcủa một quản trị viên hệ thống.Tùy
thuộcvào kích thướccủa bộ nhớ đệm mà tin tặc có thể kết hợp nhiều loại mã khác
nhau. Nhữngloại mãthường được sử dụnglà những loại đượcgọi làShellcode. Mã
này sẽ trả về một Shell (ví dụ một dấu nhắc C:\ của Windows) tới người đã chạy
đoạn mã đó. Trongmột ngữ cảnh phù hợpthì người chạy mãđó sẽ có toàn quyền
kiểmsoátvới máy trạm này. Tràn bộ nhớ đệm cóthể xảy ra dưới nhiềuhìnhthức
và quy mô, một người thành thạo trong việc điều khiển ngăn xếp sẽ chiếmđược

toànquyền kiểmsoátmọi hệ thống dễ bị tấn công.
Data Execution Prevention
Phương pháp đơn giảnnhấtđể chặn khả năngkhaitháclỗ hổng phát sinh do tràn
bộ nhớ đệm mà các lậptrình viên thường sử dụng là luôn đảm bảo mã lập trình
được bảo mật.Thựcra đây khôngphải làmộttiến trìnhđược tự độnghóa vì nó
yêu cầu tiêutốn nhiều thời gian vàcôngsứccho việc kiểmtra lại mã để đảm bảo
rằng tính toànvẹn của mã chương trình được duy trì, do đó số lượng dòng lệnh tỉ
lệ thuận vớithời gian và công sứccần phải bỏ ra. Xuấtphát từ yêu cầu đó
Microsoftđã phát triển một tínhnăngcó tên Data ExecutionPrevention(DEP).
DEP, một tínhnăngbảo mật đượcgiới thiệu trongWindowsXP SP2, được thiết kế
để chặnứng dụng chạy mã trong vùng không thể chạy của bộ nhớ. DEPxuất hiện
trong cả cấu hình Hardware-based DEP (nền tảng phần cứng) và Software-based
DEP (nền tảng phần mềm).
Hardware-based DEP
DEP được cho là bảo mật nhấtkhisử dụngHardware-basedDEP.Trong trường
hợp nàyvi xử lý sẽ đánh dấu mọi vị trí nhớ là “khôngthể thựcthi”nếuvị trí này
khôngchứamã thực thi. Mụcđích của việcnày là DEP sẽ chặn mọi mã chạytrong
những vùng không thể thựcthi.
Vấn đề chính của việc sử dụng Hardware-based DEP là nó chỉ được hỗ trợ bởimột
số ít tiến trình. Vi xử lýcó thể thực hiệnđượcđiềunày là nhờ có tínhnăng NX của
bộ vi xử lý AMDvàXD củaIntel.
Software-based DEP
KhiHardware-basedDEPkhôngtồntạithì Software-basedDEPphảiđược sử dụng.
Loại DEP này được tíchhợptrong hệ điều hành Windows. Software-basedDEP
vận hành bằng cách dò tìm thời điểm mànhững ngoại lệ được các chươngtrình
đưa vào và đảmbảo rằngnhữngngoại lệ này là một phần hợplệ của chương trình
này trướckhicho phép chúng xử lý.
Cấu hình Data Execution Prevention
TrongWindows7, DEP có thể được cấu hình trong Control Panel của hệ
thống. Vào Control Panel | Advanced System Settings. Chọn tab Data Execution

Prevention.
Hình 3: Cấu hình mặc định của DEP trong Windows 7.
DEP cóhai tùychọn cấu hình.Tùy chọn mặc địnhtrong hình3 được gọi là
cấu hình OptIn.Tùy chọn này chỉ áp dụng DEP cho những chươngtrình và dịchvụ
hệ thốngquantrọng.Đây là một cấp độ bảo mật thấp (được gọi là cấu hình
OptOut), nhưngnếu muốnsử dụng một cấpđộ bảo mật caohơn bạn nên lựa chọn
tùy chọn thứ hai, tùy chọnnày áp dụngDEPcho mọi chương trìnhvàdịch vụ trên
hệ thống.Lưu ýrằng, phía dưới củahộp thoại nàycho biết CPUđangsử dụngcóhỗ
trợ Hardware-based DEP hay không.
Mặcdù việc cấu hìnhDEP áp dụngcho mọi chương trìnhvàdịch vụ có cấpđộ bảo
mậtcao nhất, nhưng cần nhớ rằng nó lại ẩn chứa những vấn đề về tương thích.
Thứ nhất,một số chương trìnhsẽ thựchiện nhữngchức năngchính thống mà có
thể bị DEP chặn do phươngpháp chúng vận hành.Trong nhữngtrườnghợpnày
chúng ta phảitạomộtngoại lệ cho chương trìnhđó.Trên hộp thoạicấu hình DEP,
nhấnnút Addrồi lựachọn những file thực thi phù hợp. Microsoft đề xuấtrằng chỉ
nên sử dụng những driver được đăng ký để ngăn chặn những vấn đề tươngthích
có thể xảyra khilựa chọn tùy chọn thứ hai này.
Hình 4: Cấu hình DEP cho mọi dịch vụ và tạo chương trình ngoại lệ.
Sau khi thực hiện và lưucấu hình,khi xuất hiện mã thực thi trong vùng
khôngthể thực thi DEP sẽ hiển thị thôngbáo như trong hình5.
Hình 5: DEP chặn thực thi trong Windows Explorer.
Kết luận
Trànbộ nhớ đệm tưởng như khôngcógì nguy hại nhưng lại là một trong
những mối đedọa tới khả năng bảo mật hệ thốngđángchúý nhất. Cơ bản, tin tặc
thường nhằm vào lỗinày để khai thác hệ thống.Nếu là mộtlập trình viên bạn nên
hạn chế lỗi này bằng cách đảm bảo quá trình kiểm tra mã và ápdụng các biện pháp
bảo mật mã.Nếu là một quản trị viên hệ thống bạncó thể sử dụng DEP để ngăn
chặn những nguycơ bảo mật cóthể phát sinh.

×