diff options
Diffstat (limited to 'sandbox.c')
| -rw-r--r-- | sandbox.c | 25 |
1 files changed, 14 insertions, 11 deletions
| @@ -113,13 +113,16 @@ void sbox_enter(const char *basedir) | |||
| 113 | 113 | ||
| 114 | #define LL_R LANDLOCK_ACCESS_FS_READ_FILE | 114 | #define LL_R LANDLOCK_ACCESS_FS_READ_FILE |
| 115 | #define LL_X LANDLOCK_ACCESS_FS_EXECUTE | 115 | #define LL_X LANDLOCK_ACCESS_FS_EXECUTE |
| 116 | #define LL_RWC (LL_R | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_REG | LANDLOCK_ACCESS_FS_TRUNCATE) | 116 | #define LL_RWCF (LL_R | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_REG | LANDLOCK_ACCESS_FS_TRUNCATE | LANDLOCK_ACCESS_FS_REMOVE_FILE | LANDLOCK_ACCESS_FS_REFER) |
| 117 | #define LL_UNX (LL_R | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_SOCK) | 117 | #define LL_RWCD (LL_RWCF | LANDLOCK_ACCESS_FS_MAKE_DIR | LANDLOCK_ACCESS_FS_REMOVE_DIR) |
| 118 | #define LL_CON LANDLOCK_ACCESS_NET_CONNECT_TCP | 118 | #define LL_UNIX (LL_R | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_SOCK) |
| 119 | #define LL_BND LANDLOCK_ACCESS_NET_BIND_TCP | 119 | #define LL_CONN LANDLOCK_ACCESS_NET_CONNECT_TCP |
| 120 | #define LL_BIND LANDLOCK_ACCESS_NET_BIND_TCP | ||
| 120 | 121 | ||
| 121 | #define LANDLOCK_PATH(p, r) do {\ | 122 | #define LANDLOCK_PATH(p, r) do {\ |
| 122 | path.allowed_access = r;\ | 123 | path.allowed_access = r;\ |
| 124 | if (abi < 2)\ | ||
| 125 | path.allowed_access &= ~LANDLOCK_ACCESS_FS_REFER;\ | ||
| 123 | if (abi < 3)\ | 126 | if (abi < 3)\ |
| 124 | path.allowed_access &= ~LANDLOCK_ACCESS_FS_TRUNCATE;\ | 127 | path.allowed_access &= ~LANDLOCK_ACCESS_FS_TRUNCATE;\ |
| 125 | path.parent_fd = open(p, O_PATH | O_CLOEXEC);\ | 128 | path.parent_fd = open(p, O_PATH | O_CLOEXEC);\ |
| @@ -145,9 +148,9 @@ void sbox_enter(const char *basedir) | |||
| 145 | }\ | 148 | }\ |
| 146 | } while (0) | 149 | } while (0) |
| 147 | 150 | ||
| 148 | LANDLOCK_PATH(basedir, LL_RWC); | 151 | LANDLOCK_PATH(basedir, LL_RWCD); |
| 149 | LANDLOCK_PATH("/tmp", LL_RWC); | 152 | LANDLOCK_PATH("/tmp", LL_RWCD); |
| 150 | LANDLOCK_PATH("/dev/shm", LL_RWC); | 153 | LANDLOCK_PATH("/dev/shm", LL_RWCF); |
| 151 | LANDLOCK_PATH("/etc/resolv.conf", LL_R ); | 154 | LANDLOCK_PATH("/etc/resolv.conf", LL_R ); |
| 152 | LANDLOCK_PATH("/etc/hosts", LL_R ); | 155 | LANDLOCK_PATH("/etc/hosts", LL_R ); |
| 153 | LANDLOCK_PATH("/etc/ssl/openssl.cnf", LL_R ); | 156 | LANDLOCK_PATH("/etc/ssl/openssl.cnf", LL_R ); |
| @@ -155,16 +158,16 @@ void sbox_enter(const char *basedir) | |||
| 155 | LANDLOCK_PATH("/usr/share/zoneinfo", LL_R ); | 158 | LANDLOCK_PATH("/usr/share/zoneinfo", LL_R ); |
| 156 | 159 | ||
| 157 | if (*address == '/') | 160 | if (*address == '/') |
| 158 | LANDLOCK_PATH(address, LL_UNX); | 161 | LANDLOCK_PATH(address, LL_UNIX); |
| 159 | 162 | ||
| 160 | if (abi > 3) { | 163 | if (abi > 3) { |
| 161 | if (*address != '/') { | 164 | if (*address != '/') { |
| 162 | LANDLOCK_PORT( | 165 | LANDLOCK_PORT( |
| 163 | (uint16_t)xs_number_get(xs_dict_get(srv_config, "port")), LL_BND); | 166 | (uint16_t)xs_number_get(xs_dict_get(srv_config, "port")), LL_BIND); |
| 164 | } | 167 | } |
| 165 | 168 | ||
| 166 | LANDLOCK_PORT(80, LL_CON); | 169 | LANDLOCK_PORT(80, LL_CONN); |
| 167 | LANDLOCK_PORT(443, LL_CON); | 170 | LANDLOCK_PORT(443, LL_CONN); |
| 168 | } | 171 | } |
| 169 | 172 | ||
| 170 | if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { | 173 | if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { |