sandbox.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "xs.h"
  2. #include "snac.h"
  3. #include <unistd.h>
  4. #if defined (__linux__)
  5. #define LL_PRINTERR(fmt, ...) srv_debug(0, xs_fmt(fmt, __VA_ARGS__))
  6. #include "landloc.h"
  7. #define LL_R LANDLOCK_ACCESS_FS_READ_FILE
  8. #define LL_X LANDLOCK_ACCESS_FS_EXECUTE
  9. #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)
  10. #define LL_RWCD (LL_RWCF | LANDLOCK_ACCESS_FS_MAKE_DIR | LANDLOCK_ACCESS_FS_REMOVE_DIR)
  11. #define LL_UNIX (LL_R | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_SOCK)
  12. #define LL_CONN LANDLOCK_ACCESS_NET_CONNECT_TCP
  13. #define LL_BIND LANDLOCK_ACCESS_NET_BIND_TCP
  14. static
  15. LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail) {
  16. LL_PATH(basedir, LL_RWCD);
  17. LL_PATH("/tmp", LL_RWCD);
  18. #ifndef WITHOUT_SHM
  19. LL_PATH("/dev/shm", LL_RWCF);
  20. #endif
  21. LL_PATH("/etc/resolv.conf", LL_R );
  22. LL_PATH("/etc/hosts", LL_R );
  23. LL_PATH("/etc/ssl/openssl.cnf", LL_R );
  24. LL_PATH("/etc/ssl/cert.pem", LL_R );
  25. LL_PATH("/usr/share/zoneinfo", LL_R );
  26. if (*address == '/')
  27. LL_PATH(address, LL_UNIX);
  28. if (smail)
  29. LL_PATH("/usr/sbin/sendmail", LL_X);
  30. if (*address != '/') {
  31. LL_PORT(
  32. (unsigned short)xs_number_get(xs_dict_get(srv_config, "port")), LL_BIND);
  33. }
  34. LL_PORT(80, LL_CONN);
  35. LL_PORT(443, LL_CONN);
  36. } LL_END
  37. #endif
  38. void sbox_enter(const char *basedir)
  39. {
  40. if (xs_is_true(xs_dict_get(srv_config, "disable_openbsd_security"))) {
  41. srv_log(xs_dup("disable_openbsd_security is deprecated. Use disable_sandbox instead."));
  42. return;
  43. }
  44. if (xs_is_true(xs_dict_get(srv_config, "disable_sandbox"))) {
  45. srv_debug(0, xs_dup("Sandbox disabled by admin"));
  46. return;
  47. }
  48. const char *address = xs_dict_get(srv_config, "address");
  49. int smail = !xs_is_true(xs_dict_get(srv_config, "disable_email_notifications"));
  50. #if defined (__OpenBSD__)
  51. srv_debug(1, xs_fmt("Calling unveil()"));
  52. unveil(basedir, "rwc");
  53. unveil("/tmp", "rwc");
  54. unveil("/etc/resolv.conf", "r");
  55. unveil("/etc/hosts", "r");
  56. unveil("/etc/ssl/openssl.cnf", "r");
  57. unveil("/etc/ssl/cert.pem", "r");
  58. unveil("/usr/share/zoneinfo", "r");
  59. if (smail)
  60. unveil("/usr/sbin/sendmail", "x");
  61. if (*address == '/')
  62. unveil(address, "rwc");
  63. unveil(NULL, NULL);
  64. srv_debug(1, xs_fmt("Calling pledge()"));
  65. xs *p = xs_str_new("stdio rpath wpath cpath flock inet proc dns fattr");
  66. if (smail)
  67. p = xs_str_cat(p, " exec");
  68. if (*address == '/')
  69. p = xs_str_cat(p, " unix");
  70. pledge(p, NULL);
  71. xs_free(p);
  72. #elif defined (__linux__)
  73. sbox_enter_linux_(basedir, address, smail);
  74. srv_log(xs_dup("landlocked"));
  75. #endif
  76. }