mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
tmp3
This commit is contained in:
parent
655b98d50a
commit
ce39f41cef
3 changed files with 128 additions and 6 deletions
|
@ -378,6 +378,105 @@ void ScriptApiSecurity::initializeSecurityClient()
|
||||||
setLuaEnv(L, thread);
|
setLuaEnv(L, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScriptApiSecurity::initializeSecuritySSCSM()
|
||||||
|
{
|
||||||
|
static const char *whitelist[] = {
|
||||||
|
"assert",
|
||||||
|
"core",
|
||||||
|
"collectgarbage",
|
||||||
|
"DIR_DELIM", //TODO: useless?
|
||||||
|
"error",
|
||||||
|
"getfenv",
|
||||||
|
"ipairs",
|
||||||
|
"next",
|
||||||
|
"pairs",
|
||||||
|
"pcall",
|
||||||
|
"print", //TODO
|
||||||
|
"rawequal",
|
||||||
|
"rawget",
|
||||||
|
"rawset",
|
||||||
|
"select",
|
||||||
|
"setfenv",
|
||||||
|
"getmetatable",
|
||||||
|
"setmetatable",
|
||||||
|
"tonumber",
|
||||||
|
"tostring",
|
||||||
|
"type",
|
||||||
|
"unpack", //TODO: replace, because of UB in some lua versions
|
||||||
|
"_VERSION",
|
||||||
|
"xpcall",
|
||||||
|
// Completely safe libraries
|
||||||
|
"coroutine",
|
||||||
|
"string",
|
||||||
|
"table",
|
||||||
|
"math",
|
||||||
|
"bit",
|
||||||
|
};
|
||||||
|
static const char *os_whitelist[] = {
|
||||||
|
"clock", //TODO: limit resolution, to mitigate side channel attacks
|
||||||
|
"date",
|
||||||
|
"difftime",
|
||||||
|
"time"
|
||||||
|
};
|
||||||
|
|
||||||
|
#if USE_LUAJIT
|
||||||
|
static const char *jit_whitelist[] = {
|
||||||
|
"arch",
|
||||||
|
"flush",
|
||||||
|
"off",
|
||||||
|
"on",
|
||||||
|
"opt",
|
||||||
|
"os",
|
||||||
|
"status",
|
||||||
|
"version",
|
||||||
|
"version_num",
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_secure = true;
|
||||||
|
|
||||||
|
lua_State *L = getStack();
|
||||||
|
int thread = getThread(L);
|
||||||
|
|
||||||
|
// create an empty environment
|
||||||
|
createEmptyEnv(L);
|
||||||
|
|
||||||
|
// Copy safe base functions
|
||||||
|
lua_getglobal(L, "_G");
|
||||||
|
lua_getfield(L, -2, "_G");
|
||||||
|
copy_safe(L, whitelist, sizeof(whitelist));
|
||||||
|
|
||||||
|
// And replace unsafe ones
|
||||||
|
SECURE_API(g, dofile);
|
||||||
|
SECURE_API(g, load);
|
||||||
|
SECURE_API(g, loadfile);
|
||||||
|
SECURE_API(g, loadstring);
|
||||||
|
SECURE_API(g, require);
|
||||||
|
lua_pop(L, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Copy safe OS functions
|
||||||
|
lua_getglobal(L, "os");
|
||||||
|
lua_newtable(L);
|
||||||
|
copy_safe(L, os_whitelist, sizeof(os_whitelist));
|
||||||
|
lua_setfield(L, -3, "os");
|
||||||
|
lua_pop(L, 1); // Pop old OS
|
||||||
|
|
||||||
|
|
||||||
|
#if USE_LUAJIT
|
||||||
|
// Copy safe jit functions, if they exist
|
||||||
|
lua_getglobal(L, "jit");
|
||||||
|
lua_newtable(L);
|
||||||
|
copy_safe(L, jit_whitelist, sizeof(jit_whitelist));
|
||||||
|
lua_setfield(L, -3, "jit");
|
||||||
|
lua_pop(L, 1); // Pop old jit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set the environment to the one we created earlier
|
||||||
|
setLuaEnv(L, thread);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ScriptApiSecurity::getThread(lua_State *L)
|
int ScriptApiSecurity::getThread(lua_State *L)
|
||||||
|
@ -775,10 +874,11 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L)
|
||||||
#if CHECK_CLIENT_BUILD()
|
#if CHECK_CLIENT_BUILD()
|
||||||
ScriptApiBase *script = ModApiBase::getScriptApiBase(L);
|
ScriptApiBase *script = ModApiBase::getScriptApiBase(L);
|
||||||
|
|
||||||
// Client implementation
|
// SSCSM & CPCSM implementation
|
||||||
if (script->getType() == ScriptingType::Client) {
|
if (script->getType() == ScriptingType::Client
|
||||||
|
|| script->getType() == ScriptingType::SSCSM) {
|
||||||
std::string path = readParam<std::string>(L, 1);
|
std::string path = readParam<std::string>(L, 1);
|
||||||
const std::string *contents = script->getClient()->getModFile(path);
|
const std::string *contents = script->getClient()->getModFile(path); //TODO
|
||||||
if (!contents) {
|
if (!contents) {
|
||||||
std::string error_msg = "Couldn't find script called: " + path;
|
std::string error_msg = "Couldn't find script called: " + path;
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
|
|
|
@ -31,8 +31,10 @@ public:
|
||||||
void initializeSecurity();
|
void initializeSecurity();
|
||||||
#if CHECK_CLIENT_BUILD()
|
#if CHECK_CLIENT_BUILD()
|
||||||
void initializeSecurityClient();
|
void initializeSecurityClient();
|
||||||
|
void initializeSecuritySSCSM();
|
||||||
#else
|
#else
|
||||||
inline void initializeSecurityClient() { assert(0); }
|
void initializeSecurityClient() { assert(0); }
|
||||||
|
void initializeSecuritySSCSM() { assert(0); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Checks if the Lua state has been secured
|
// Checks if the Lua state has been secured
|
||||||
|
|
|
@ -3,16 +3,36 @@
|
||||||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
|
||||||
#include "scripting_sscsm.h"
|
#include "scripting_sscsm.h"
|
||||||
|
#include "cpp_api/s_internal.h"
|
||||||
|
#include "lua_api/l_sscsm.h"
|
||||||
|
// #include "lua_api/l_util.h"
|
||||||
|
|
||||||
SSCSMScripting::SSCSMScripting(SSCSMEnvironment *env) :
|
SSCSMScripting::SSCSMScripting(SSCSMEnvironment *env) :
|
||||||
ScriptApiBase(ScriptingType::SSCSM)
|
ScriptApiBase(ScriptingType::SSCSM)
|
||||||
{
|
{
|
||||||
setSSCSMEnv(env);
|
setSSCSMEnv(env);
|
||||||
|
|
||||||
//TODO
|
SCRIPTAPI_PRECHECKHEADER
|
||||||
|
|
||||||
|
initializeSecuritySSCSM();
|
||||||
|
|
||||||
|
lua_getglobal(L, "core");
|
||||||
|
int top = lua_gettop(L);
|
||||||
|
|
||||||
|
// Initialize our lua_api modules
|
||||||
|
initializeModApi(L, top);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
|
// Push builtin initialization type
|
||||||
|
lua_pushstring(L, "sscsm");
|
||||||
|
lua_setglobal(L, "INIT");
|
||||||
|
|
||||||
|
// infostream << "SCRIPTAPI: Initialized SSCSM modules" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSCSMScripting::initializeModApi(lua_State *L, int top)
|
void SSCSMScripting::initializeModApi(lua_State *L, int top)
|
||||||
{
|
{
|
||||||
//TODO
|
// Initialize mod API modules
|
||||||
|
// ModApiUtil::Initialize(L, top);
|
||||||
|
ModApiSSCSM::Initialize(L, top);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue