From e574a6cc1f053a16158bd228cf0ec9c6b255ad09 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 3 Jul 2016 15:35:58 +0200 Subject: [PATCH] nametransform: hide detailed padding error behind the debug flag unPad16 returns detailed errors including the position of the incorrect bytes. Kill a possible padding oracle by lumping everything into a generic error. The detailed error is only logged if debug is active. --- internal/fusefrontend/fs_dir.go | 4 ++-- internal/nametransform/names.go | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/fusefrontend/fs_dir.go b/internal/fusefrontend/fs_dir.go index 9547ce6..4657b95 100644 --- a/internal/fusefrontend/fs_dir.go +++ b/internal/fusefrontend/fs_dir.go @@ -265,7 +265,7 @@ func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, f if isLong == nametransform.LongNameContent { cNameLong, err := nametransform.ReadLongName(filepath.Join(cDirAbsPath, cName)) if err != nil { - tlog.Warn.Printf("Skipping file %q in dir %q: Could not read .name: %v", + tlog.Warn.Printf("Skipping entry %q in dir %q: Could not read .name: %v", cName, cDirName, err) errorCount++ continue @@ -278,7 +278,7 @@ func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, f name, err := fs.nameTransform.DecryptName(cName, cachedIV) if err != nil { - tlog.Warn.Printf("Skipping invalid name %q in dir %q: %s", + tlog.Warn.Printf("Skipping entry %q in dir %q: %s", cName, cDirName, err) errorCount++ continue diff --git a/internal/nametransform/names.go b/internal/nametransform/names.go index 4930488..89ce0db 100644 --- a/internal/nametransform/names.go +++ b/internal/nametransform/names.go @@ -10,6 +10,7 @@ import ( "github.com/rfjakob/eme" "github.com/rfjakob/gocryptfs/internal/cryptocore" + "github.com/rfjakob/gocryptfs/internal/tlog" ) type NameTransform struct { @@ -42,7 +43,11 @@ func (n *NameTransform) DecryptName(cipherName string, iv []byte) (string, error bin = eme.Transform(n.cryptoCore.BlockCipher, iv, bin, eme.DirectionDecrypt) bin, err = unPad16(bin) if err != nil { - return "", err + tlog.Debug.Printf("pad16 error detail: %v", err) + // unPad16 returns detailed errors including the position of the + // incorrect bytes. Kill the padding oracle by lumping everything into + // a generic error. + return "", fmt.Errorf("Invalid padding") } plain := string(bin) return plain, err