First off all thanks jca@ and sthen@ for the energy you put in this
topic.

On Mon Jun 03, 2019 at 09:39:16PM +0100, Stuart Henderson wrote:
> On 2019/06/03 21:38, Rafael Sadowski wrote:
> > On Sun Jun 02, 2019 at 05:41:37PM +0200, Jeremie Courreges-Anglas wrote:
> > > On Sun, Jun 02 2019, Rafael Sadowski <raf...@sizeofvoid.org> wrote:
> > > > Update keepassxc to 2.4.2
> > > >
> > > > CHANGELOG:
> > > > https://github.com/keepassxreboot/keepassxc/releases/tag/2.4.2
> > > >
> > > > I send the Alloc class patch upsteream as usual. Tests and feedback
> > > > welcome.
> > > 
> > > I didn't check anything else, but the Alloc class patch shouldn't be
> > > sent upstream as-is, IMO.  Please see below.
> > > 
> > > > RS
> > > >
> > > > ===================================================================
> > > > RCS file: patches/patch-src_core_Alloc_cpp
> > > > diff -N patches/patch-src_core_Alloc_cpp
> > > > --- /dev/null   1 Jan 1970 00:00:00 -0000
> > > > +++ patches/patch-src_core_Alloc_cpp    2 Jun 2019 09:44:06 -0000
> > > > @@ -0,0 +1,23 @@
> > > > +$OpenBSD$
> > > > +
> > > > +Index: src/core/Alloc.cpp
> > > > +--- src/core/Alloc.cpp.orig
> > > > ++++ src/core/Alloc.cpp
> > > > +@@ -20,6 +20,8 @@
> > > > + #include <sodium.h>
> > > > + #ifdef Q_OS_MACOS
> > > > + #include <malloc/malloc.h>
> > > > ++#elif defined(Q_OS_OPENBSD)
> > > > ++#include <stdlib.h>
> > > > + #else
> > > > + #include <malloc.h>
> > > > + #endif
> > > > +@@ -61,7 +63,7 @@ void operator delete(void* ptr) noexcept
> > > > +     ::operator delete(ptr, _msize(ptr));
> > > > + #elif defined(Q_OS_MACOS)
> > > > +     ::operator delete(ptr, malloc_size(ptr));
> > > > +-#elif defined(Q_OS_UNIX)
> > > > ++#elif defined(Q_OS_LINUX)
> > > > +     ::operator delete(ptr, malloc_usable_size(ptr));
> > > > + #else
> > > > +     // whatever OS this is, give up and simply free stuff
> > > >
> > > 
> > > I think the port's cmake setup should check for malloc_usable_size and
> > > malloc.h, use them if available, and fall back on stdlib.h / std::free()
> > > if not.  OpenBSD is not the only OS where malloc.h isn't available, and
> > > Linux (glibc really) isn't the only OS where malloc_usable_size() is
> > > available.  This kind of #ifdef practice is actively harmful for
> > > portability.
> > > 
> > > Also if the goal is to securely erase memory before freeing it,
> > > maybe freezero(3) is a possible alternative?
> > > 
> > > -- 
> > > jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 
> > > E7EE
> > > 
> > 
> > Thanks Jeremie for saving me from a mistake.
> > 
> > There is no way to fix this on OpenBSD so let's disable for now. New
> > diff which disabled the custom delete operator.
> > 
> > General question, what does it make sense to delete each heap allocated
> > (just allocated memory with "new") memory so?
> 
> AIUI they aren't tracking every allocation which _does_ use memory to hold
> some sensitive data, so are blindly zeroing everything they can when the
> allocation is deleted. Might slow things down a bit but this shouldn't be
> a performance critical program anyway and why not wipe the things where
> they can.
> 
> > In my opinion, we're not losing anything here.
> > 
> > 
> > Index: Makefile
> > ===================================================================
> > RCS file: /cvs/ports/security/keepassxc/Makefile,v
> > retrieving revision 1.20
> > diff -u -p -u -p -r1.20 Makefile
> > --- Makefile        21 Apr 2019 11:29:44 -0000      1.20
> > +++ Makefile        3 Jun 2019 19:17:16 -0000
> > @@ -2,7 +2,7 @@
> >  
> >  COMMENT =  management tool for password and sensitive data
> >  
> > -V =                2.4.1
> > +V =                2.4.2
> >  DISTNAME = keepassxc-${V}
> >  
> >  CATEGORIES =       security
> > @@ -16,7 +16,7 @@ PERMIT_PACKAGE_CDROM =    Yes
> >  
> >  WANTLIB += ${COMPILER_LIBCXX} Qt5Concurrent Qt5Core Qt5DBus Qt5Gui
> >  WANTLIB += Qt5Network Qt5Svg Qt5Widgets Qt5X11Extras X11 Xi Xtst
> > -WANTLIB += argon2 c gcrypt gpg-error m qrencode z
> > +WANTLIB += argon2 c gcrypt gpg-error m qrencode sodium z
> >  
> >  MASTER_SITES =     
> > https://github.com/keepassxreboot/keepassxc/releases/download/${V}/
> >  EXTRACT_SUFX =     -src.tar.xz
> > @@ -25,6 +25,7 @@ MODULES = x11/qt5 \
> >             devel/cmake
> >  
> >  LIB_DEPENDS =      security/libgcrypt \
> > +           security/libsodium \
> >             security/argon2 \
> >             graphics/libqrencode \
> >             x11/qt5/qtsvg \
> > @@ -36,8 +37,8 @@ RUN_DEPENDS =     devel/desktop-file-utils \
> >  
> >  CONFIGURE_ARGS=    -DCMAKE_INSTALL_MANDIR="man" \
> >             -DWITH_GUI_TESTS=ON \
> > -           -DWITH_XC_SSHAGENT=ON \
> > -           -DWITH_XC_AUTOTYPE=ON
> > +           -DWITH_XC_AUTOTYPE=ON \
> > +           -DWITH_XC_SSHAGENT=ON
> >  
> >  TEST_IS_INTERACTIVE =      X11
> >  
> > @@ -52,10 +53,8 @@ WANTLIB += yubikey ykpers-1
> >  .endif
> >  
> >  .if ${FLAVOR:Mbrowser}
> > -LIB_DEPENDS +=             security/libsodium
> >  CONFIGURE_ARGS +=  -DWITH_XC_BROWSER=ON \
> >                     -DWITH_XC_NETWORKING=ON
> > -WANTLIB    +=              sodium
> >  .endif
> >  
> >  post-patch:
> > Index: distinfo
> > ===================================================================
> > RCS file: /cvs/ports/security/keepassxc/distinfo,v
> > retrieving revision 1.11
> > diff -u -p -u -p -r1.11 distinfo
> > --- distinfo        21 Apr 2019 11:29:44 -0000      1.11
> > +++ distinfo        3 Jun 2019 19:17:16 -0000
> > @@ -1,2 +1,2 @@
> > -SHA256 (keepassxc-2.4.1-src.tar.xz) = 
> > Dal70SedG5sGpjufcjtDq4wHi38SA9bBNQT91HNUias=
> > -SIZE (keepassxc-2.4.1-src.tar.xz) = 3277856
> > +SHA256 (keepassxc-2.4.2-src.tar.xz) = 
> > FfptCikgVYZLGXnGcfE+W65QVuGeKAwwzBzwuW6lYTg=
> > +SIZE (keepassxc-2.4.2-src.tar.xz) = 3290468
> > Index: patches/patch-src_CMakeLists_txt
> > ===================================================================
> > RCS file: patches/patch-src_CMakeLists_txt
> > diff -N patches/patch-src_CMakeLists_txt
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-src_CMakeLists_txt        3 Jun 2019 19:17:16 -0000
> > @@ -0,0 +1,19 @@
> > +$OpenBSD$
> > +
> > +https://github.com/keepassxreboot/keepassxc/pull/3020
> 
> Including this in the comment is a bit confusing because normally when
> we include a URL to a pull request or commit, we are telling the reader
> where the patch came from.

Valid point what do you think about:

Revert a part from:
https://github.com/keepassxreboot/keepassxc/pull/3020

Remove the custom delete operator which zeroes out allocated memory before
freeing it. OpenBSD does not and will implement glibc's malloc_usable_size(3)
interface.

"The main use of this function is for debugging and introspection." From
http://man7.org/linux/man-pages/man3/malloc_usable_size.3.html

> 
> > +Remove the custom delete operator which zeroes out allocated memory before
> > +freeing it. OpenBSD does not and will implement glibc's 
> > malloc_usable_size(3)
> > +interface. "The main use of this function is for debugging and 
> > introspection."
> > 
> > +Index: src/CMakeLists.txt
> > +--- src/CMakeLists.txt.orig
> > ++++ src/CMakeLists.txt
> > +@@ -24,7 +24,6 @@ if(NOT ZXCVBN_LIBRARIES)
> > + endif(NOT ZXCVBN_LIBRARIES)
> > + 
> > + set(keepassx_SOURCES
> > +-        core/Alloc.cpp
> > +         core/AutoTypeAssociations.cpp
> > +         core/AutoTypeMatch.cpp
> > +         core/Compare.cpp
> 
> Rather than killing the whole file I think you should patch Alloc.cpp instead.

That was my first idea. But ...

> 
>  31 /**
>  32  * Custom sized delete operator which securely zeroes out allocated
>  33  * memory before freeing it (requires C++14 sized deallocation support).
>  34  */
>  35 void operator delete(void* ptr, std::size_t size) noexcept
>  36 {
>  37     if (!ptr) {
>  38         return;
>  39     }
>  40 
>  41     sodium_memzero(ptr, size);
>  42     std::free(ptr);
>  43 }
>  44 
>  45 void operator delete[](void* ptr, std::size_t size) noexcept
>  46 {
>  47     ::operator delete(ptr, size);
>  48 }
> 
> These first two replace the C++14 sized "delete" / "delete[]" so in cases
> where those are used it already knows how much to zero, they should work
> on OpenBSD too.
> 

They don't use C++14 delete operators. That's why it doesn't make sense
to me. So it would just be an illusion

>  50 /**
>  51  * Custom delete operator which securely zeroes out
>  52  * allocated memory before freeing it.
>  53  */
>  54 void operator delete(void* ptr) noexcept
>  55 {
>  56     if (!ptr) {
>  57         return;
>  58     }
>  59 
>  60 #if defined(Q_OS_WIN)
>  61     ::operator delete(ptr, _msize(ptr));
>  62 #elif defined(Q_OS_MACOS)
>  63     ::operator delete(ptr, malloc_size(ptr));
>  64 #elif defined(Q_OS_UNIX)
>  65     ::operator delete(ptr, malloc_usable_size(ptr));
>  66 #else
>  67     // whatever OS this is, give up and simply free stuff
>  68     std::free(ptr);
>  69 #endif
>  70 }
>  71 
>  72 void operator delete[](void* ptr) noexcept
>  73 {
>  74     ::operator delete(ptr);
>  75 }
> 
> And these two are for the traditional non-sized "delete" / "delete[]"
> where it's relying on the various nonportable functions to try to figure it
> out, it's these that I think there is nothing we can do to sanely help.
> 

The only way I see it is to look at each case individually.
IMHO they did it right with FileKey.cpp, PasswordKey.cpp etc. but not
with Alloc.cpp.

Reply via email to