2008-11-28 19 views
6

Tôi chỉ đang làm việc trên một giải pháp chuỗi cục bộ Lua, khi tôi nghĩ ra vấn đề này, tôi không biết làm cách nào để tránh bị tấn công bởi nó :) Vì vậy, tôi đã tự hỏi nếu có ai, đã làm điều gì đó tương tự và hoặc biết cách bảo vệ khỏi loại tấn công này. (Trong mã người dùng)Có cách nào để tránh sự cố bảo mật này trong Lua không?

Kể từ khi chúng ta có thể làm điều này:

=("foo"):upper() -->output: FOO 

Nó có thể bị hack như thế này:

getmetatable("foo").__index.upper = function() print("bye bye sucker");os.exit() end 
=("foo"):upper() -->output: bye bye sucker (application quits) 
-- or this way 
=string.upper("bar") -->output: bye bye sucker (application quits) 

Bất kỳ ý tưởng?

+1

Không cần phải sử dụng chuỗi có thể so sánh được; nó chỉ đơn giản là chuỗi bảng toàn cục. Vì vậy, bằng cách sử dụng string.upper = function ... người dùng cuối sẽ vẫn có thể thay đổi chức năng. – jpjacobs

Trả lời

8

Đầu tiên và trước hết thực thi mã không đáng tin cậy trong môi trường hộp cát chỉ - như được nói bởi các áp phích khác. Ngoại trừ việc tải khối byte bytecode, Lua cho phép tất cả các vấn đề sandboxing khác được đề cập đến. (Và các vấn đề về đoạn mã byte được khắc phục ngay lập tức khi được phát hiện.)

Xem Lua Live Demo để biết ví dụ về hộp cát.Các nguồn có sẵn here.

vấn đề cụ thể của bạn với metatables được giải quyết bằng cách thiết lập một lĩnh vực __metatable:

Nếu bạn đặt một lĩnh vực __metatable trong metatable, getmetatable sẽ trả về giá trị của lĩnh vực này, trong khi setmetatable sẽ nâng cao một lỗi .

- Roberto Ierusalimschy, Lập trình trong Lua 1st edition, 13,3 - Library-Defined Metamethods

Ví dụ:

> mt = { __metatable = true }             
> t = {} 
> setmetatable(t, mt) 
> setmetatable(t, mt) 
stdin:1: cannot change a protected metatable 
stack traceback: 
[C]: in function 'setmetatable' 
stdin:1: in main chunk 
[C]: ? 

Vì vậy, tất cả các bạn phải làm là:

getmetatable("").__metatable = true 
+0

__metatable là những gì tôi đang tìm kiếm, đã quên điều này! –

6

Nếu tin tặc của bạn có khả năng thêm mã và bạn cần phải cho phép mã đó gọi những thứ như os.exit, thì dù sao thì bạn cũng khá may mắn.

Tuy nhiên, bạn có thể hạn chế các chức năng mà mã của họ có thể gọi. Nó phụ thuộc vào những gì bạn vẫn muốn mã người dùng có thể làm. Xem doc cho setfenv và google cho "lua sandbox"

+0

Tôi có nghĩa là tất nhiên các mô-đun os không có sẵn cho người dùng, nhưng tôi sử dụng nó cho các yếu tố tác động trong mã của tôi. Dù sao, cảm ơn ý tưởng sandbox, đã không nghĩ về việc googling đó. –

2

Tôi không chắc tại sao bạn gặp sự cố, vì bạn có thể đã biết về hộp cát: bạn có thể xóa các chức năng nguy hiểm như io.exit và bạn có thể đảm bảo ghi đè các hàm chỉ là các hàm trong bảng toàn cầu của người dùng, nghĩa là. các hàm Lua được sử dụng trong nội bộ bởi ứng dụng của bạn sẽ vẫn nguyên vẹn.
Trong mọi trường hợp, nếu hacker có thể gọi trực tiếp os.exit, thực tế anh ta có thể tự bắn vào chân bằng cách tăng thêm một chức năng vô tội mà anh ta sẽ sử dụng sau đó là vấn đề của anh ta.
Bên cạnh đó, nó chỉ là vấn đề nếu bạn chạy các chức năng người dùng trên máy chủ của bạn, ví dụ: nếu hacker phá hủy hệ thống của mình, một lần nữa, đó là vấn đề của anh ấy!
Bây giờ, cũng có vấn đề về phân phối mã nguy hiểm: bạn có thể hạn chế sức mạnh của tập lệnh người dùng. Sau khi tất cả, đó là những gì các trình duyệt làm với JavaScript.

+0

Vấn đề là ghi đè string.upper, không trực tiếp sử dụng os.exit. Nhưng tôi không chắc chắn nếu sandboxing sẽ trực tiếp bảo vệ chống lại các trọng, nhưng bây giờ mà bạn đề cập đến nó, tôi cũng nên ẩn các get/setmetatable chức năng từ môi trường người dùng. –

0

Tôi không có giải pháp (Tôi không sử dụng Lua, tôi chỉ quan tâm đến nó từ xa), nhưng những gì bạn đang sau được gọi là "sandbox". Google cho Lua sandbox, tôi đã tìm thấy một vài trang có vẻ thú vị theo cách đó. Ví dụ: http://lua-users.org/wiki/SandBoxes.

2

vấn đề bảo mật này thường minh họa bằng câu này, cho biết qua Ford Trưởng trong sổ rực rỡ của Hitchhiker Guide to the Galaxy: It rather involved being on the other side of this airtight hatchway

khả năng của tôi để viết mã không thể được cho là một an ninh dễ bị tổn thương và nếu bạn không thể kiểm soát mã của mình, thì rằng là sự cố bảo mật của bạn chứ không phải mã nào có thể làm.

Có rất nhiều thứ bạn có thể làm nếu bạn chỉ có thể làm cho máy thực thi một số mã của bạn. An ninh là để tránh nhận được mã trong đó ở nơi đầu tiên. Tất cả mọi thứ sau đó chỉ là thiệt hại tài sản thế chấp.

Cách để tránh bị tấn công bởi sự cố đó là để tránh nhận mã không xác định vào ứng dụng của bạn.

+0

+1 để kiểm tra thực tế, tuy nhiên mục tiêu của tôi là cho phép một số mã người dùng được chạy. Nhưng có bạn là đúng Tôi cần phải suy nghĩ lại vấn đề của tôi ở đây –

+0

Cách tiếp cận sandbox những người khác được đề cập là không biết đến tôi, vì vậy có vẻ như bạn có một cách để hạn chế khả năng này trong trường hợp này. –

1

Tôi không thấy khả năng xác định lại upper là sự cố. Có thể nhìn thấy os.exit là vấn đề.

Theo đề xuất của người khác, hãy tạo môi trường hộp cát cho tập lệnh của bạn. Mỗi tập lệnh có thể lấy một tập lệnh mới; sau đó một người có thể xác định lại trên hoặc bất cứ điều gì như thế, và tất cả họ sẽ vít lên là điều riêng của họ.

Tạo trạng thái Lua quá nhanh và dễ dàng, điều này sẽ không gây ra bất kỳ sự cố nào.

Một điều khác mà bạn có thể coi là vòng lặp vĩnh cửu. Tạo một 'cơ quan giám sát' giết chết một tập lệnh sau, giả sử 10000 lệnh mất khoảng 10 dòng mã C. Tôi có thể gửi cho bạn mẫu nếu bạn cần.

Các vấn đề liên quan