猿问

Go[lang] 二进制文件上的 SetGID/SetUID 是否安全?

我写了一个简单的 走 程序使用 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 me

pw mypassword

但是在我的代码中,我必须使用User和Pw(大写)而不是像我预期的那样使用小写。我认为这是Goyaml的作者的一个实施决定。是这样吗?


#!go

package main


import (

    "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()


BIG阳
浏览 198回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答