oneprocess.c
上传用户:ig0539
上传日期:2022-05-21
资源大小:181k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

C/C++

  1. /*
  2.  * Part of Very Secure FTPd
  3.  * Licence: GPL v2
  4.  * Author: Chris Evans
  5.  * oneprocess.c
  6.  *
  7.  * Code for the "one process" security model. The one process security model
  8.  * is born for the purposes of raw speed at the expense of compromising the
  9.  * purity of the security model.
  10.  * The one process model will typically be disabled, for security reasons.
  11.  * Only sites with huge numbers of concurrent users are likely to feel the
  12.  * pain of two processes per session.
  13.  */
  14. #include "prelogin.h"
  15. #include "postlogin.h"
  16. #include "privops.h"
  17. #include "session.h"
  18. #include "secutil.h"
  19. #include "str.h"
  20. #include "tunables.h"
  21. #include "utility.h"
  22. #include "sysstr.h"
  23. #include "sysdeputil.h"
  24. #include "sysutil.h"
  25. #include "ptracesandbox.h"
  26. #include "ftppolicy.h"
  27. static void one_process_start(void* p_arg);
  28. void
  29. vsf_one_process_start(struct vsf_session* p_sess)
  30. {
  31.   if (tunable_sandbox)
  32.   {
  33.     struct pt_sandbox* p_sandbox = ptrace_sandbox_alloc();
  34.     if (p_sandbox == 0)
  35.     {
  36.       die("could not allocate sandbox (only works for 32-bit builds)");
  37.     }
  38.     policy_setup(p_sandbox, p_sess);
  39.     if (ptrace_sandbox_launch_process(p_sandbox,
  40.                                       one_process_start,
  41.                                       (void*) p_sess) <= 0)
  42.     {
  43.       die("could not launch sandboxed child");
  44.     }
  45.     /* TODO - could drop privs here. For now, run as root as the attack surface
  46.      * is negligible, and running as root permits us to correctly deliver the
  47.      * parent death signal upon unexpected crash.
  48.      */
  49.     (void) ptrace_sandbox_run_processes(p_sandbox);
  50.     ptrace_sandbox_free(p_sandbox);
  51.     vsf_sysutil_exit(0);
  52.   }
  53.   else
  54.   {
  55.     one_process_start((void*) p_sess);
  56.   }
  57. }
  58. static void
  59. one_process_start(void* p_arg)
  60. {
  61.   struct vsf_session* p_sess = (struct vsf_session*) p_arg;
  62.   unsigned int caps = 0;
  63.   if (tunable_chown_uploads)
  64.   {
  65.     caps |= kCapabilityCAP_CHOWN;
  66.   }
  67.   if (tunable_connect_from_port_20)
  68.   {
  69.     caps |= kCapabilityCAP_NET_BIND_SERVICE;
  70.   }
  71.   {
  72.     struct mystr user_name = INIT_MYSTR;
  73.     struct mystr chdir_str = INIT_MYSTR;
  74.     str_alloc_text(&user_name, tunable_ftp_username);
  75.     if (tunable_anon_root)
  76.     {
  77.       str_alloc_text(&chdir_str, tunable_anon_root);
  78.     }
  79.     if (tunable_run_as_launching_user)
  80.     {
  81.       if (!str_isempty(&chdir_str))
  82.       {
  83.         str_chdir(&chdir_str);
  84.       }
  85.     }
  86.     else
  87.     {
  88.       vsf_secutil_change_credentials(&user_name, 0, &chdir_str, caps,
  89.           VSF_SECUTIL_OPTION_CHROOT |
  90.           VSF_SECUTIL_OPTION_USE_GROUPS |
  91.           VSF_SECUTIL_OPTION_NO_PROCS);
  92.     }
  93.     str_free(&user_name);
  94.     str_free(&chdir_str);
  95.   }
  96.   if (tunable_sandbox)
  97.   {
  98.     ptrace_sandbox_attach_point();
  99.   }
  100.   init_connection(p_sess);
  101. }
  102. void
  103. vsf_one_process_login(struct vsf_session* p_sess,
  104.                       const struct mystr* p_pass_str)
  105. {
  106.   enum EVSFPrivopLoginResult login_result =
  107.     vsf_privop_do_login(p_sess, p_pass_str);
  108.   switch (login_result)
  109.   {
  110.     case kVSFLoginFail:
  111.       return;
  112.       break;
  113.     case kVSFLoginAnon:
  114.       p_sess->is_anonymous = 1;
  115.       process_post_login(p_sess);
  116.       break;
  117.     default:
  118.       bug("bad state in vsf_one_process_login");
  119.       break;
  120.   }
  121. }
  122. int
  123. vsf_one_process_get_priv_data_sock(struct vsf_session* p_sess)
  124. {
  125.   unsigned short port = vsf_sysutil_sockaddr_get_port(p_sess->p_port_sockaddr);
  126.   return vsf_privop_get_ftp_port_sock(p_sess, port);
  127. }
  128. void
  129. vsf_one_process_pasv_cleanup(struct vsf_session* p_sess)
  130. {
  131.   vsf_privop_pasv_cleanup(p_sess);
  132. }
  133. int
  134. vsf_one_process_pasv_active(struct vsf_session* p_sess)
  135. {
  136.   return vsf_privop_pasv_active(p_sess);
  137. }
  138. unsigned short
  139. vsf_one_process_listen(struct vsf_session* p_sess)
  140. {
  141.   return vsf_privop_pasv_listen(p_sess);
  142. }
  143. int
  144. vsf_one_process_get_pasv_fd(struct vsf_session* p_sess)
  145. {
  146.   return vsf_privop_accept_pasv(p_sess);
  147. }
  148. void
  149. vsf_one_process_chown_upload(struct vsf_session* p_sess, int fd)
  150. {
  151.   vsf_privop_do_file_chown(p_sess, fd);
  152. }