<div dir="ltr"><div>I see the point of replacing bash with another programming language, that being said, I feel the urge to say something about this without falling into the trap of ranting about programming languages. One of the key points of pass that was really the selling point for me was, apart from perfectly solving the problem it was designed to solve, the transparency of the implementation. The ability to just open a file and understand what is going on is really convenient. I can just prepend a "set -x" to the top of the script and observe/debug every single bit during execution. I developed <a href="https://github.com/vy/pass-extension-copyq">pass-extension-copyq</a> in minutes without consulting to any manuals, but just reading the source code. I did not need to compile anything, just made my changes and there I go. It is not a black box, it is not a magic ball. It is a freaking awesome single-file bash script.</div><div><br></div><div>Long story short... <b>Please, please, please, do not replace bash with a compiled language.</b> Let it be Python, let it be Ruby, etc. I don't care. (Actually I do care, availability across a wide range of platforms is a great plus. Though I love pass so much that I can install scheme48 if pass just happens to depend on it.) Please go with a scripting language and keep this awesome implementation transparency intact.</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jun 14, 2018 at 5:11 PM Jason A. Donenfeld <<a href="mailto:Jason@zx2c4.com">Jason@zx2c4.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hey list,<br>
<br>
After discussing pass and GPG with Marcus Brinkmann at FOSDEM this<br>
year, and then witnessing the amazing bugs in Enigmail a while back,<br>
Marcus went and had a look at how our shell script is actually dealing<br>
with GPG output. He discovered (1) that our parsing of gpg command<br>
line output with regexes isn't anchored to the beginning of the line,<br>
which means an attacker can generate a malicious key that simply has<br>
the verification string as part of its username, which fixed in pass<br>
1.7.2. This has a number of nasty consequences: a) an attacker who<br>
manages to write into your ~/.password-store and also inject a<br>
malicious key into your keyring can replace your .gpg-id key and have<br>
your passwords encrypted under additional keys; b) if you have<br>
extensions enabled (disabled by default), an attacker who manages to<br>
write into your ~/.password-store and also inject a malicious key into<br>
your keyring can replace your extensions and hence execute code. This<br>
has been assigned CVE-2018-12356.<br>
<br>
Marcus also points out two secondary problems related to integrity.<br>
The first secondary problem (2) is that while we try to preserve gpg's<br>
exit code, in case of a decryption failure, the gpg tool has a<br>
deficiency that it always writes to stdout before verification, which<br>
is mitigated in pass 1.7.2 by simply buffering the output ourselves<br>
(ugh). The second secondary problem (3) is that pass does not sign its<br>
files, which means an attacker who manages to write into your<br>
~/.password-store and also inject a malicious key into your keyring<br>
can display the wrong password. Problem (3) is not a new finding at<br>
all for pass, and I group it together with the well-known related<br>
aspect, which is that the directory tree itself doesn't have any<br>
integrity: you can add, remove, and rename files trivially, if you're<br>
not using git with commit signing. Pass's direct use of GPG has always<br>
focused on secrecy without a lot of focus on authenticity, blaming the<br>
GPG tooling again. Our recommendations for authenticity and integrity<br>
continue to be to enable git commit signing, which pass has built-in<br>
support for.<br>
<br>
One way to add this directly to pass without relying on git to handle<br>
it for us is by adding signatures to each file, which I've long<br>
resisted for a variety of reasons, both due to the GPG tooling<br>
boogieman, as well as semantic issues with then verifying against user<br>
ids that have been removed from .gpg-id. Perhaps a different way would<br>
be for pass to use its own keyring, rather than the default ~/.gnupg<br>
keyring; we can discuss ideas like these for 1.8. Either way, if<br>
you're managing and sync'ing your password store using git, you really<br>
should be signing those git commits. Perhaps we can also consider<br>
_enforcing_ git signatures.<br>
<br>
I remember Marcus and my funny conversation at FOSDEM, during which he<br>
asked me my ideas on the GPG interface and what it provides and what<br>
pass might need from it, which provoked what was evidently a lot of<br>
pent-up frustration in me with the command line tools. I recall<br>
mentioning how pass is this ever-sprawling bash script filled with<br>
impossible to understand regular expressions, because GPG doesn't<br>
provide a more precise interface for verifying and extracting the<br>
information we need. I'm quite happy he looked into it for us.<br>
<br>
There are two reasons why my presence on this list is fairly minimal<br>
these days: I'm extremely hesitant to add new junk to pass, as I don't<br>
think feature bloat is actually a real feature with tools like this,<br>
which are supposed to be simple, and I've been fantasizing about some<br>
rearchitecting for a long time. One plan for that would be to simply<br>
use a cleaner subset of bash -- no use of sed, only bash regular<br>
expressions. The other would be to rewrite this in a real programming<br>
language and link to the gpgme library, which ostensibly gives us<br>
fine-grained verification and checking. The argument against the<br>
latter has been that the appeal of pass is that it's "just" a simple<br>
bash script; however, as Marcus' findings have pointed out, is it<br>
actually possible to use the GPG command line utility from bash in a<br>
way that is both safe and simple? Seems like it might be a "choose<br>
one" situation, and the result will always be fragile at best. On the<br>
other hand, the prospect of investing energy into byzantine interfaces<br>
like GPG seems perhaps misguided, and we might consider alternatives.<br>
Either way, I will do some significant reworking for pass 1.8, to<br>
cleanup a rather elementary script into something as robust as<br>
possible.<br>
<br>
So with that said, please upgrade to pass 1.7.2, and don't hesitate to<br>
email me directly if you find additional issues.<br>
<br>
Regards,<br>
Jason<br>
_______________________________________________<br>
Password-Store mailing list<br>
<a href="mailto:Password-Store@lists.zx2c4.com" target="_blank">Password-Store@lists.zx2c4.com</a><br>
<a href="https://lists.zx2c4.com/mailman/listinfo/password-store" rel="noreferrer" target="_blank">https://lists.zx2c4.com/mailman/listinfo/password-store</a><br>
</blockquote></div>