Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Sep 2023 15:02:56 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Alexander Leidinger <Alexander@leidinger.net>
Cc:        FreeBSD Jail ML <freebsd-jail@freebsd.org>
Subject:   Re: Opening of /dev/pts/3 fails in jail (no such file), but it is visible in ls
Message-ID:  <ZQ2CcGme1wZ6zHuF@kib.kiev.ua>
In-Reply-To: <1c9037e072f646e02082e143e42c70e0@Leidinger.net>
References:  <1c9037e072f646e02082e143e42c70e0@Leidinger.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Sep 22, 2023 at 01:44:33PM +0200, Alexander Leidinger wrote:
> Hi,
> 
> I'm trying to debug an issue with pinentry-tty. The reason is that I want to
> export a gpg secret key, but it fails when the gpg-agent tries to ask for
> the PW. An alternative way to export the key works, but the main way should
> work too. So I took the time now to dig deeper. This is inside a jail, I
> haven't tried if it is the same effect outside a jail.
> 
> With the gpg developer Werner Koch I tried to debug this, and we went down
> to do a pinentry-wrapper which calls pinentry within ktrace.
> 
> The important part is this:
> ---snip---
> 79943 pinentry-tty RET   write 1
>  79943 pinentry-tty CALL  read(0x3,0x464697e00158,0x3ea)
>  79943 pinentry-tty GIO   fd 3 read 7 bytes
>        "GETPIN
>        "
>  79943 pinentry-tty RET   read 7
>  79943 pinentry-tty CALL  sigaction(SIGALRM,0x3fee6ca161d0,0)
>  79943 pinentry-tty RET   sigaction 0
>  79943 pinentry-tty CALL  sigaction(SIGINT,0x3fee6ca161d0,0)
>  79943 pinentry-tty RET   sigaction 0
>  79943 pinentry-tty CALL
> setitimer(ITIMER_REAL,0x3fee6ca16160,0x3fee6ca16140)
>  79943 pinentry-tty STRU  itimerval { .interval = {0, 0}, .value = {60, 0} }
>  79943 pinentry-tty STRU  itimerval { .interval = {0, 0}, .value = {0, 0} }
>  79943 pinentry-tty RET   setitimer 0
>  79943 pinentry-tty CALL  open(0x46469782c020,0<O_RDONLY>)
>  79943 pinentry-tty NAMI  "/dev/pts/3"
>  79943 pinentry-tty RET   open -1 errno 2 No such file or directory
>  79943 pinentry-tty CALL  write(0x4,0x3fee6ca16420,0x36)
>  79943 pinentry-tty GIO   fd 4 wrote 54 bytes
>        "ERR 83886179 Verarbeitung wurde abgebrochen <Pinentry>"
>  79943 pinentry-tty RET   write 54/0x36
>  79943 pinentry-tty CALL  write(0x4,0x3fee6dd96326,0x1)
>  79943 pinentry-tty GIO   fd 4 wrote 1 byte
> ---snip---
> 
> The file exists and I see it inside the jail:
> ---snip---
> % ll /dev/pts/3
> crw--w----  1 netchild tty 0x180 22 Sep. 12:44 /dev/pts/3
> ---snip---
> 
> The corresponding code is here:
>     https://github.com/gpg/pinentry/blob/master/tty/pinentry-tty.c#L547
> 
> The ttyname comes from the env (set via "export GPG_TTY=$(tty)") set in my
> .zshenv when logging in (ssh to host, jexec into jail, "su - netchild" ->
> .zshenv -> GPG_TTY is set).
> 
> If I do the same via ssh to this account, a new PTS is allocated and this
> works.
> 
> So clearly, the jail is restricting the access to the pts which was
> allocated on the host side instead of the jail side.
> 
> On one hand this is understandable, as it was not created inside the jail.
> On the other hand the expectation is if I see the pts inside the jail, I
> should be able to access it. I can see it with ls, but I can not open it
> with open(). There is a mismatch.
> 
> The first question which comes to my mind now is, what the bug is... is it a
> bug that it is visible in ls, or is it a bug that I can not open it? What is
> the reason for the unexpected behavior I see?
Both actions behave as expected:
- visibility is governed by devfs rules, it operates on names of the
  devfs nodes
- opening pty requires corresponding privileges.

So everything works as expected.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ZQ2CcGme1wZ6zHuF>