Improves how we handle symlinks in plugin management.
(cherry picked from commit 04df634ef5)
Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
This commit is contained in:
co-authored by
Marcus Efraimsson
parent
e037f7ace7
commit
504ecbd4f9
@@ -620,7 +620,7 @@ func isSymlinkRelativeTo(basePath string, symlinkDestPath string, symlinkOrigPat
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(p, ".."+string(filepath.Separator)) {
|
if p == ".." || strings.HasPrefix(p, ".."+string(filepath.Separator)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,6 +280,34 @@ func TestIsSymlinkRelativeTo(t *testing.T) {
|
|||||||
symlinkOrigPath: "/dir/sub-dir/test1.txt",
|
symlinkOrigPath: "/dir/sub-dir/test1.txt",
|
||||||
expected: false,
|
expected: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "Symbolic link pointing to relative file outside basePath should return false",
|
||||||
|
basePath: "/dir",
|
||||||
|
symlinkDestPath: "../../",
|
||||||
|
symlinkOrigPath: "/dir/sub-sir/symlink.txt",
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Symbolic link pointing to relative file outside basePath should return false",
|
||||||
|
basePath: "/dir",
|
||||||
|
symlinkDestPath: "../..",
|
||||||
|
symlinkOrigPath: "/dir/sub-sir/symlink.txt",
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Symbolic link pointing to relative file outside basePath should return false",
|
||||||
|
basePath: "/dir",
|
||||||
|
symlinkDestPath: "../../",
|
||||||
|
symlinkOrigPath: "/dir/sub-sir/",
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "Symbolic link pointing to relative file outside basePath should return false",
|
||||||
|
basePath: "/dir",
|
||||||
|
symlinkDestPath: "../..",
|
||||||
|
symlinkOrigPath: "/dir/sub-sir/",
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tcs {
|
for _, tc := range tcs {
|
||||||
|
|||||||
@@ -109,6 +109,14 @@ func Calculate(mlog log.Logger, plugin *plugins.Plugin) (plugins.Signature, erro
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pluginFiles, err := pluginFilesRequiringVerification(plugin)
|
||||||
|
if err != nil {
|
||||||
|
mlog.Warn("Could not collect plugin file information in directory", "pluginID", plugin.ID, "dir", plugin.PluginDir)
|
||||||
|
return plugins.Signature{
|
||||||
|
Status: plugins.SignatureInvalid,
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
|
||||||
manifestPath := filepath.Join(plugin.PluginDir, "MANIFEST.txt")
|
manifestPath := filepath.Join(plugin.PluginDir, "MANIFEST.txt")
|
||||||
|
|
||||||
// nolint:gosec
|
// nolint:gosec
|
||||||
@@ -184,14 +192,6 @@ func Calculate(mlog log.Logger, plugin *plugins.Plugin) (plugins.Signature, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
if manifest.isV2() {
|
if manifest.isV2() {
|
||||||
pluginFiles, err := pluginFilesRequiringVerification(plugin)
|
|
||||||
if err != nil {
|
|
||||||
mlog.Warn("Could not collect plugin file information in directory", "pluginID", plugin.ID, "dir", plugin.PluginDir)
|
|
||||||
return plugins.Signature{
|
|
||||||
Status: plugins.SignatureInvalid,
|
|
||||||
}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Track files missing from the manifest
|
// Track files missing from the manifest
|
||||||
var unsignedFiles []string
|
var unsignedFiles []string
|
||||||
for _, f := range pluginFiles {
|
for _, f := range pluginFiles {
|
||||||
@@ -264,19 +264,19 @@ func pluginFilesRequiringVerification(plugin *plugins.Plugin) ([]string, error)
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip symlink directories
|
|
||||||
if symlink.IsDir() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify that symlinked file is within plugin directory
|
// verify that symlinked file is within plugin directory
|
||||||
p, err := filepath.Rel(plugin.PluginDir, symlinkPath)
|
p, err := filepath.Rel(plugin.PluginDir, symlinkPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(p, ".."+string(filepath.Separator)) {
|
if p == ".." || strings.HasPrefix(p, ".."+string(filepath.Separator)) {
|
||||||
return fmt.Errorf("file '%s' not inside of plugin directory", p)
|
return fmt.Errorf("file '%s' not inside of plugin directory", p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skip adding symlinked directories
|
||||||
|
if symlink.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip directories and MANIFEST.txt
|
// skip directories and MANIFEST.txt
|
||||||
|
|||||||
Reference in New Issue
Block a user