Go版本
go版本:go1.21.1 darwin/arm64
你正在使用什么操作系统和处理器架构(go env
)?
GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/cweagans/Library/Caches/go-build'
GOENV='/Users/cweagans/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/cweagans/Developer/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/cweagans/Developer/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/opt/homebrew/Cellar/go/1.21.1/libexec'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.21.1/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.1'
GCCGO='gccgo'
AR='ar'
CC='cc'
CXX='c++'
CGO_ENABLED='1'
GOMOD='/Users/cweagans/Developer/github.com/swirldslabs/txauth/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/xh/xytgk13j0v33_8zj9qdtpyh80000gp/T/go-build3042814605=/tmp/go-build -gno-record-gcc-switches -fno-common'
你做了什么?
我们有一个代理协议扩展,有时可以通过代理协议发送相当多的数据 - 超过了由https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.17.0:ssh/agent/client.go;l=156施加的16kb限制。由于代理协议没有指定限制,我没想到Go库会施加一个限制,最终花了很多时间缩小问题的范围。
你期望看到什么?
我期望能够通过连接发送任意数量的任意数据。
你看到了什么?
我无法做到这一点,并在日志中得到了这个错误:agent 11: agent: client error: response too large
。
9条答案
按热度按时间zpf6vheq1#
CC @drakkan.
yb3bgrhw2#
感谢cweagans报告此问题。您能否分享一个复现器并确认它与OpenSSH代理实现一起工作?
k4ymrczo3#
当然,给你!
OpenSSH似乎没有使用任何代理协议扩展,除了
session-bind@openssh.com
(用于设置key restrictions),所以我不确定如何将其与OpenSSH的任何实现进行验证。任何广泛使用的实现都不会真正关心自定义协议扩展。我的特定用例与协议扩展(本质上是特定于我的项目)有关,但我在规范中没有看到指定最大代理回复大小的地方。关于
maxAgentResponseBytes
的注解也同意这一点。看起来client.List()
依赖于这个值来判断代理回复中的密钥是否过多,而client.CallRaw
以您所期望的方式使用它。我不太确定client.List()
在使用该变量时是否做得正确。只是在这里集思广益:有什么理由不让
maxAgentResponseBytes
成为一个公共变量,开发者可以简单地更改它?默认值可以保持不变——在大多数情况下,这是一个相当合理的限制。或者,我们可以添加一个额外的接口(具有方法GetMaxAgentResponseBytes() int
或类似功能的ConfigurableAgent
),可以根据每个代理的基础覆盖该限制(这样内部方法将使用maxAgentResponseBytes
的值或返回的GetMaxAgentResponseBytes()
)。我在项目中暂时通过简单地将补丁应用于
agent
包来解决这个问题,将值更改为16 << 24
。testagent.go
(展开源代码)更改
maxAgentResponseBytes
之前:更改
maxAgentResponseBytes
之后:mrwjdhj34#
非常感谢您的回复。我之所以提出这个问题,是因为OpenSSH似乎也有一个类似的限制。
您的请求是有道理的,我们需要提出新的API并通过审核。
gijlo24d5#
好的,我能帮什么忙?我应该写那份提案吗?你对哪个方向有想法?(公共变量vs新接口vs仅更改默认值)
sd2nnvve6#
在这段代码中,限制是在初始实现时引入的。它并没有为了解决特定的问题而添加,而只是作为一种防止消耗过多内存等的合理性检查。
也许我们可以增加这个限制。对于你的用例来说,什么是一个合适的值呢?例如,1MB的限制对于任何用例都是适当的,同时我们仍然保持现有的合理性检查不变。
我不认为使用公共变量是一个好选择。如果不能接受改变默认值,我们应该添加一个接口扩展或者一个选项(例如
func NewClient(rw io.ReadWriter, options ...AgentOption) ExtendedAgent
)。我希望得到其他维护者的意见
cc @golang/security
jc3wubiy7#
我认为我们不应该仅仅更改默认值。这可能会解决我个人的问题,但限制的理想值确实取决于你如何使用库。
在我看来,它应该真正可配置,以便开发人员可以为他们的特定应用程序设置正确的值。
x0fgdtte8#
嗯,我想不出代理不可信的场景,也许我们可以移除这个限制,而不是让它可配置。
7kjnsjlb9#
这对我来说似乎很合理。