我写了一个简单的 走 程序使用 YAML 和 MySQL 驱动程序,目的是提供一个简单的实用程序来更新数据库,而不会将用户名和密码凭据暴露给执行程序的用户。(我很清楚我也可以用 Python 或其他一些脚本语言编写它并使用 须藤 但我想在这里尝试不同的方法,为我自己的启迪)。建立程序后,我已经使用chgrp sys dbcreds.yaml && chmod 0640 dbcreds.yaml和chgrp sys ./myprog && chmod g+s ./myprog(作为root)......,一切似乎工作。(我还测试了在 setGID 步骤之前访问被拒绝,因为它应该是)。我还进行了测试strace,结果导致权限被拒绝(应该如此)。(为了好玩,我也运行ltrace -S了它;这是在 Linux 下。正如预期的那样,我没有看到很多正常的 libc 函数调用......通过我很惊讶地看到了一些pthread_....()和一个malloc()调用在那个清单中。我猜 GO 运行时确实链接到了一些系统库函数)。我的问题:这安全吗?是否有任何已知的方法可以导致 Go 程序(如下)在读取这些私有凭据后进行核心转储或公开其内存?在我阅读了我的凭据后,有没有办法删除我的 SGID 权限?是否有针对 Go 二进制文件的 SUID/SGID 漏洞利用示例?有一个更好的方法吗?有没有办法主动防止核心转储或确保敏感数据(凭据)不会在核心转储中?另一个注意事项:我发现gopkg.in/yaml.v2语义有点令人不安。在我的 YAML 文件中,我有类似的内容:---user mepw mypassword但是在我的代码中,我必须使用User和Pw(大写)而不是像我预期的那样使用小写。我认为这是Goyaml的作者的一个实施决定。是这样吗?#!gopackage mainimport ( "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" "gopkg.in/yaml.v2" "io/ioutil" "os" "strconv")type Creds struct { User string Pw string}func main() { filename := "./dbcreds.yaml" var creds Creds conf, err := ioutil.ReadFile(filename) if err != nil { panic(err) } err = yaml.Unmarshal(conf, &creds) if err != nil { panic(err) } var arg1 int arg1, err = strconv.Atoi(os.Args[1]) if err != nil { panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic } fmt.Println("arg1: ", arg1, "\n") dsn := fmt.Sprintf("%s:%s@/mydatabase", creds.User, creds.Pw) db, err := sql.Open("mysql", dsn) if err != nil { panic(err.Error()) } defer db.Close() err = db.Ping() if err != nil { panic(err.Error()) } stmtOut, err := db.Prepare("SELECT quant FROM c WHERE id >= ?") if err != nil { panic(err.Error()) } defer stmtOut.Close() rows, err := stmtOut.Query(arg1) if err != nil { panic(err.Error()) } defer rows.Close()
1 回答
- 1 回答
- 0 关注
- 197 浏览
添加回答
举报
0/150
提交
取消