** Description changed:

+ [ Impact ]
+ 
+  * when running sub-processes on login through pam_exec a process
+    is spawned. That can confuse vsftp if that child ends triggering SIGCHLD 
but 
+    already been picke dup by e.g. pam_exec.so itself.
+ 
+  * The fix uses waitpid over wait to be able to pass options. With that
+    it sets WNOHANG when calling vsf_sysutil_wait is called from 
common_do_login 
+    (as there pam_exec would run if configured). That allows it to
+    "return immediately if no child has exited" [1]
+ 
+ [1]: https://manpages.ubuntu.com/manpages/noble/en/man2/wait.2.html
+ 
+ [ Test Plan ]
+ 
+ # install
+ $ apt install lftp vsftpd
+ # change config
+ $ sed -i.old '1 i\account optional pam_exec.so debug quiet /root/foo.sh\' 
/etc/pam.d/vsftpd
+ # script to run
+ $ cat > /root/foo.sh << EOF
+ #!/bin/bash
+ /bin/true
+ touch /tmp/brooks-was-here
+ /bin/true
+ EOF
+ $ chmod +x /root/foo.sh
+ # enable ssl
+ $ sed -i -s -e 's/ssl_enable=NO/ssl_enable=YES/' /etc/vsftpd.conf
+ $ systemctl restart vsftpd.service
+ # Place a file there
+ $ echo foobar > /home/ubuntu/egal
+ # set test PW to ubuntu user
+ echo 'ubuntu:ubuntu' | chpasswd
+ 
+ # Using it with ftps (and ignore cert verification as it is the snakeoil
+ cert)
+ 
+ To verify the test config, if you run this in a second console you should see 
it calling the script as yo uact on the server.
+ $ tail -f /var/log/auth.log
+ ...
+ 2024-07-16T07:30:37.966553+00:00 o vsftpd: pam_exec(vsftpd:account): Calling 
/root/foo.sh ...
+ 
+ Good case (Noble / Oracular):
+ 
+ root@n:~# lftp 127.0.0.1
+ lftp 127.0.0.1:~> set ftp:ssl-force true
+ lftp 127.0.0.1:~> set ssl:verify-certificate false
+ lftp 127.0.0.1:~> login ubuntu ubuntu
+ lftp ubuntu@127.0.0.1:~> dir
+ -rw-r--r-- 1 0 0 7 Jul 16 07:30 egal
+ lftp ubuntu@127.0.0.1:~> get egal
+ 7 bytes transferred
+ lftp ubuntu@127.0.0.1:~>
+ exit
+ root@n:~# cat egal
+ foobar
+ 
+ Bad case (Focal and Jammy)
+ root@j:~# lftp 127.0.0.1
+ lftp 127.0.0.1:~> set ftp:ssl-force true
+ lftp 127.0.0.1:~> set ssl:verify-certificate false
+ lftp 127.0.0.1:~> login ubuntu ubuntu
+ lftp ubuntu@127.0.0.1:~> dir
+ `ls' at 0 [Sending commands...]
+ 
+ [ Where problems could occur ]
+ 
+ * This changes signal handling for SIGCHLD.
+   The code now returns cleanly if there was nobody to wait for, which formerly
+   would have caused a the main process to die "Child died, so we'll do the 
same"
+   That is intentionally changed for the condition of the child already being 
+   consumed.
+   If there is a use case of the child leaving which was meant to terminate
+   (unlikely, this is an unclean die call) it might no more happen now.
+ 
+ [ Other Info ]
+ 
+ * The code is the same (only no change rebuilds) still, this does not occur 
in 
+   Noble and Oracular. At least not with the current test setup. That is 
slightly
+   disturbing.
+   Also in the reproduction we've seen that it only occurred with FTPS, but 
that 
+   is not conceptually tied to the problem, it might only be yet another detail
+   that changes the timing and size of the signal race window.
+   Of course we can assume that it is just a race and the window is 
+   different there, but then should we not fix it? Or we can assume something 
+   else e.g. pam_exec has changed behavior to mask the issue and hence no 
vsftpd 
+   change is needed there. I think it is wasted to  research this for ages, 
but 
+   it leaves some uncertainty.
+ 
+ 
+ ---
+ 
  When you try to run a script with pam_exec.so on login vsftpd freezes
  with SIGCHLD.
  
  This was fixed in 2015 by redhat and never adopted to Debian/Ubunutu.
  
  See also:
  - https://bugzilla.redhat.com/show_bug.cgi?id=1198259
  - 
https://git.centos.org/rpms/vsftpd/blob/54ac5fac29fcc1bb68f2e96e63ecfda655286ff8/f/SOURCES/0026-Prevent-hanging-in-SIGCHLD-handler.patch

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2069324

Title:
  vsftpd hangs with SIGCHLD when pam_exec.so is used

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/vsftpd/+bug/2069324/+subscriptions


-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to