mirror of
https://github.com/luanti-org/luanti.git
synced 2025-09-30 19:22:14 +00:00
limit clock precision to 20 us
20 us was the value, firefox used as first response to the spectre attacks. now it's 100 us or 5 us, depending on whether it's "cross-origin isolated". we only have one origin, so choosing 20 us is probably fine, I guess see also: https://www.mozilla.org/en-US/security/advisories/mfsa2018-01/ https://developer.mozilla.org/en-US/docs/Web/API/Performance/now#security_requirements other clocks: * os.time() and os.date() only have seconds precision, AFAIK. * dtime is only given once per step, so it's not useful * there might be other ways to build clocks (if we get async envs for sscsm, with a busy loop, for example)
This commit is contained in:
parent
1e0d96af26
commit
6a360e507a
5 changed files with 34 additions and 2 deletions
|
@ -105,3 +105,7 @@
|
||||||
// The intent is to ensure that the rendering doesn't turn terribly blurry
|
// The intent is to ensure that the rendering doesn't turn terribly blurry
|
||||||
// when filtering is enabled.
|
// when filtering is enabled.
|
||||||
#define TEXTURE_FILTER_MIN_SIZE 192U
|
#define TEXTURE_FILTER_MIN_SIZE 192U
|
||||||
|
|
||||||
|
// Resolution of clocks that SSCSM has access to, in us.
|
||||||
|
// Used as countermeasure against side-channel attacks.
|
||||||
|
#define SSCSM_CLOCK_RESOLUTION_US 20
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "client/mod_vfs.h"
|
#include "client/mod_vfs.h"
|
||||||
#endif
|
#endif
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -413,7 +414,6 @@ void ScriptApiSecurity::initializeSecuritySSCSM()
|
||||||
"bit",
|
"bit",
|
||||||
};
|
};
|
||||||
static const char *os_whitelist[] = {
|
static const char *os_whitelist[] = {
|
||||||
"clock", //TODO: limit resolution, to mitigate side channel attacks
|
|
||||||
"date",
|
"date",
|
||||||
"difftime",
|
"difftime",
|
||||||
"time"
|
"time"
|
||||||
|
@ -463,6 +463,10 @@ void ScriptApiSecurity::initializeSecuritySSCSM()
|
||||||
lua_getglobal(L, "os");
|
lua_getglobal(L, "os");
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
copy_safe(L, os_whitelist, sizeof(os_whitelist));
|
copy_safe(L, os_whitelist, sizeof(os_whitelist));
|
||||||
|
|
||||||
|
// And replace unsafe ones
|
||||||
|
SECURE_API(os, clock);
|
||||||
|
|
||||||
lua_setfield(L, -3, "os");
|
lua_setfield(L, -3, "os");
|
||||||
lua_pop(L, 1); // Pop old OS
|
lua_pop(L, 1); // Pop old OS
|
||||||
|
|
||||||
|
@ -1074,3 +1078,12 @@ int ScriptApiSecurity::sl_os_setlocale(lua_State *L)
|
||||||
lua_call(L, cat ? 2 : 1, 1);
|
lua_call(L, cat ? 2 : 1, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ScriptApiSecurity::sl_os_clock(lua_State *L)
|
||||||
|
{
|
||||||
|
auto t = clock();
|
||||||
|
t = t - t % (SSCSM_CLOCK_RESOLUTION_US * CLOCKS_PER_SEC / 1'000'000);
|
||||||
|
lua_pushnumber(L, static_cast<lua_Number>(t) / static_cast<lua_Number>(CLOCKS_PER_SEC));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -117,4 +117,5 @@ private:
|
||||||
static int sl_os_rename(lua_State *L);
|
static int sl_os_rename(lua_State *L);
|
||||||
static int sl_os_remove(lua_State *L);
|
static int sl_os_remove(lua_State *L);
|
||||||
static int sl_os_setlocale(lua_State *L);
|
static int sl_os_setlocale(lua_State *L);
|
||||||
|
static int sl_os_clock(lua_State *L);
|
||||||
};
|
};
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "util/png.h"
|
#include "util/png.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "daynightratio.h"
|
#include "daynightratio.h"
|
||||||
|
#include "constants.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
// only available in zstd 1.3.5+
|
// only available in zstd 1.3.5+
|
||||||
|
@ -82,6 +83,16 @@ int ModApiUtil::l_get_us_time(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get_us_time() for SSCSM
|
||||||
|
int ModApiUtil::l_get_us_time_sscsm(lua_State *L)
|
||||||
|
{
|
||||||
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
auto t = porting::getTimeUs();
|
||||||
|
t = t - t % SSCSM_CLOCK_RESOLUTION_US;
|
||||||
|
lua_pushnumber(L, t);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Maximum depth of a JSON object:
|
// Maximum depth of a JSON object:
|
||||||
// Reading and writing should not overflow the Lua, C, or jsoncpp stacks.
|
// Reading and writing should not overflow the Lua, C, or jsoncpp stacks.
|
||||||
constexpr static u16 MAX_JSON_DEPTH = 1024;
|
constexpr static u16 MAX_JSON_DEPTH = 1024;
|
||||||
|
@ -802,7 +813,7 @@ void ModApiUtil::InitializeSSCSM(lua_State *L, int top)
|
||||||
{
|
{
|
||||||
API_FCT(log);
|
API_FCT(log);
|
||||||
|
|
||||||
API_FCT(get_us_time); //TODO: is us to precise?
|
registerFunction(L, "get_us_time", l_get_us_time_sscsm, top);
|
||||||
|
|
||||||
API_FCT(parse_json);
|
API_FCT(parse_json);
|
||||||
API_FCT(write_json);
|
API_FCT(write_json);
|
||||||
|
|
|
@ -28,6 +28,9 @@ private:
|
||||||
// get us precision time
|
// get us precision time
|
||||||
static int l_get_us_time(lua_State *L);
|
static int l_get_us_time(lua_State *L);
|
||||||
|
|
||||||
|
// get_us_time() for SSCSM. less precise
|
||||||
|
static int l_get_us_time_sscsm(lua_State *L);
|
||||||
|
|
||||||
// parse_json(str[, nullvalue])
|
// parse_json(str[, nullvalue])
|
||||||
static int l_parse_json(lua_State *L);
|
static int l_parse_json(lua_State *L);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue