7

私はローカライズ可能なLua文字列ソリューションに取り組んでいましたが、このハッキングを思いついたとき、問題はそれによってハッキングされないようにする方法がわからないことです:)だから、誰かが似たようなことをしたか、または方法を知っているかどうか疑問に思いましたこの種の攻撃から保護するため。(ユーザーコード内)

これができるので:

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

次のようにハッキングされる可能性があります。

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)

何か案は?

4

6 に答える 6

9

何よりもまず、他の投稿者が言ったように、サンドボックス環境でのみ信頼できないコードを実行します。バイトコードチャンクのロードを除いて、Luaでは他のすべてのサンドボックスの問題をカバーできます。(そして、バイトコードチャンクの問題は発見されるとすぐに修正されます。)

サンドボックスの例については、LuaLiveDemoを参照してください。ソースはここから入手できます。

__metatableメタテーブルに関する特定の問題は、フィールドを設定することで解決されます。

__metatableメタテーブルにフィールド を設定するgetmetatableと、はこのフィールドの値を返しますがsetmetatable、エラーが発生します。

– Roberto Ierusalimschy、Luaのプログラミング第1版、13.3-ライブラリで定義されたメタメソッド

例えば:

> 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]: ? 

だから、あなたがしなければならないのは:

getmetatable("").__metatable = true
于 2008-11-28T17:55:54.970 に答える
6

ハッカーにコードを追加する機能があり、そのコードがos.exitなどを呼び出すことを許可する必要がある場合は、とにかく運が悪いことになります。

ただし、コードが呼び出すことができる関数を制限することはできます。それはあなたがまだユーザーコードに何をさせたいかによります。setfenvについてはドキュメントを、「luaサンドボックス」についてはgoogleを参照してください。

于 2008-11-28T09:19:06.630 に答える
2

サンドボックスについてはおそらく既に知っているので、なぜ問題が発生するのかわかりません。io.exit などの危険な関数を削除でき、オーバーライドされた関数がユーザーのグローバル テーブルにある関数のみであることを確認できます。アプリケーションによって内部的に使用される Lua 関数はそのまま残ります。
いずれにせよ、ハッカーが os.exit を直接呼び出すことができる場合、後で使用する無害な関数を過充電して自分自身を撃つことができるという事実は、ハッカーの問題です。
さらに、サーバー上でユーザー関数を実行する場合にのみ問題になります。たとえば、ハッカーがシステムを破壊した場合、それは彼の問題です!
また、危険なコードを配布するという問題もあります。ユーザー スクリプトの機能を制限するのはあなた次第です。結局のところ、それがブラウザが JavaScript で行うことです。

于 2008-11-28T09:30:57.310 に答える
2

このセキュリティ上の問題は、典型的には次の文で説明されています。Ford Prefect が素晴らしい本The Hitchhiker's Guide to the Galaxyで述べています。

コードを書く私の能力は、セキュリティ上の脆弱性とは言えません。コードを制御できない場合、それはセキュリティの問題であり、そのコードができることではありません。

マシンにコードの一部を実行させることができれば、できることは山ほどあります。セキュリティは、最初からコードを取得しないようにすることです。その後のすべては、単なる巻き添え被害です。

この問題によるハッキングを回避する方法は、不明なコードをアプリケーションに取り込まないようにすることです。

于 2008-11-28T09:41:35.650 に答える
1

問題として再定義する可能性はありませんupper。見えるos.exitかが問題です。

他の人が示唆しているように、スクリプト用のサンドボックス環境を作成してください。各スクリプトは新しいスクリプトを取得できます。その後、人はアッパーやそのようなものを再定義することができ、彼らが台無しにするのは自分のものだけです.

Lua の状態の作成は非常に高速で簡単なので、問題は発生しません。

もう 1 つ気をつけなければならないのは、永遠のループです。たとえば、10000 命令の後にスクリプトを強制終了する「ウォッチドッグ」を作成するには、約 10 行の C コードが必要です。必要であればサンプルを送ります。

于 2008-12-11T11:45:25.660 に答える
0

私には解決策がありません (私は Lua を使用していません。遠くから興味があるだけです)。Google for Lua Sandboxで、一見興味深いページがいくつか見つかりました。例: http://lua-users.org/wiki/SandBoxes

于 2008-11-28T09:33:31.517 に答える