开源操作系统发行版 OpenBSD 在系统管理员中广为人知,尤其是那些管理服务器的系统管理员,因为它更注重安全而不是速度、功能和花哨的前端。
或许,它的标志恰如其分地是一条河豚——充气的,它的尖刺随时准备击退任何可能出现的狡猾的黑客。
但 OpenBSD 团队最出名的可能不是其整个发行版,而是远程访问工具包 OpenSSH的 它是在 1990 年代后期编写的,目的是包含在操作系统本身中。
SSH,简称 安全壳, 最初由芬兰计算机科学家创建 塔图伊洛宁 在 1990 世纪 XNUMX 年代中期,希望让系统管理员摆脱使用 Telnet 协议的危险习惯。
Telnet 的问题
Telnet 非常简单和有效:您可以使用 TELetype NETwork 连接代替物理线路(或通过电话线使用调制解调器)与远程服务器建立电传打字机连接。
基本上,通常通过专用串行连接或拨号电话线来回流动的数据通过互联网发送和接收,使用分组交换 TCP 网络连接而不是电路交换点对点链路.
同样熟悉的登录系统,更便宜的连接,无需专用数据线!
当然,Telnet 的巨大缺陷是它完全没有加密,所以嗅探出你的确切终端会话是微不足道的,允许破解者看到你输入的每一个命令(甚至你犯的错误,以及你点击的所有时间 [Backspace]
), 以及输出的每个字节......
…当然还有您在会话开始时的用户名和密码。
您网络路径上的任何人不仅可以轻松地在他们自己的屏幕上实时重建您的系统管理员会话,而且还可能通过修改您发送到远程服务器的命令并伪造回复来篡改您的会话,这样您就不会注意到诡计。
他们甚至可以设置一个冒名顶替的服务器,引诱您进入它,并使您很难发现欺骗行为。
强加密FTW
Ylönen 的 SSH 旨在为类似 Telnet 的会话的每一端添加一层强大的加密和身份验证,创建一个 安全壳 (这就是这个名字所代表的意思,如果你曾经想过,虽然几乎每个人都这么叫它 少就少 这些日子)。
它一炮而红,该协议很快被各地的系统管理员采用。
正如我们上面提到的,OpenSSH 紧随其后,它于 1999 年底首次出现,作为 OpenBSD的2.6 释放。
OpenBSD 团队希望创建一个免费、可靠、开源的协议实现,他们和 任何人都可以使用,在 Ylönen 发布后的几年里,没有任何阻碍 Ylönen 最初实施的许可或商业并发症。
事实上,如果您现在运行 Windows SSH 服务器并从 Linux 计算机连接到它,您几乎可以肯定会在两端依赖 OpenSSH 实现。
SSH 协议还用于其他流行的客户端-服务器服务,包括 SCP 和 SFTP,简称 安全副本 和 安全FTP 分别。 SSH 松散地表示“安全连接并在另一端运行命令 SHell”,通常用于交互式登录,因为用于命令 shell 的 Unix 程序通常是 /bin/sh
. SCP类似,但是对于CoPying文件,因为Unix file-copy命令一般叫 /bin/cp
, SFTP 的命名方式大致相同。
OpenSSH 并不是市面上唯一的 SSH 工具包。
其他著名的实现包括: libssh2,适用于希望在自己的应用程序中直接构建 SSH 支持的开发人员; 落熊,来自澳大利亚编码器的精简 SSH 服务器 马特·约翰斯顿 在家庭路由器和打印机等所谓的 IoT(物联网)设备上广泛使用; 和 腻子,一个流行的、免费的 SSH 相关工具集合,来自独立开源开发者的 Windows 西蒙塔特姆 在英国。
但是如果你是一个普通的 SSH 用户,你几乎可以肯定现在至少连接到一个 OpenSSH 服务器,尤其是因为大多数现代 Linux 发行版都将它作为他们的标准远程访问工具,并且微软同时提供了 OpenSSH 客户端和 OpenSSH服务器现在作为官方 Windows 组件。
双免bug修复
OpenSSH 版本 9.2 刚出来,而 发行说明 报告如下:
此版本包含 [...] 内存安全问题的修复程序。 [此错误] 被认为不可利用,但我们将大多数网络可访问内存故障报告为安全错误。
该错误影响 sshd
,OpenSSH 服务器( -d
后缀代表 守护,Windows 调用的那种后台进程的 Unix 名称 服务):
sshd(8): 修复 OpenSSH 9.1 引入的预认证双释放内存故障。 这被认为是不可利用的,它发生在受 chroot(2) 影响的非特权预授权进程中,并在大多数主要平台上进一步沙盒化。
double-free 错误意味着您已经将内存块返回给操作系统,以便在程序的其他部分重新使用……
......稍后将被程序的一部分再次交还,该部分实际上不再“拥有”该内存,但不知道它不拥有。
(或者在试图故意引发错误的代码提示下故意交还,以便将 漏洞 变成一个 利用.)
这可能会导致微妙且难以解决的错误,特别是如果系统在第一个时将释放的块标记为可用 free()
发生,稍后在它通过以下方式请求内存时将其分配给代码的另一部分 malloc(
), 然后在多余的调用时再次将块标记为空闲 free()
出现。
当你入住一家酒店时,你会遇到这样的情况:“哦,好消息! 我们以为我们已经客满了,但另一位客人刚刚决定提前退房,这样您就可以入住他们的房间了。”
即使在您入住时房间已打扫干净并为新入住者做好了准备,因此看起来好像已妥善分配给您专用,您仍然必须相信前一位客人的钥匙卡确实已正确取消,并且他们的“提前结账”并不是当天晚些时候偷偷溜回来偷走你的笔记本电脑的狡猾诡计。
错误修复错误修复
具有讽刺意味的是,如果您查看最近的 OpenSSH 代码历史,您会发现 OpenSSH 在一个名为 compat_kex_proposal()
,用于检查在建立连接时使用哪种密钥交换算法。
但是修复这个小错误却引入了一个更严重的漏洞。
顺便说一句,在建立连接期间使用的部分软件中存在错误,这就是所谓的 网络可达预认证 漏洞(或 预授权错误 简称)。
double-free bug发生在需要运行的代码中 after 客户端发起了一个远程会话,但是 before 任何密钥协议或身份验证都已发生,因此从理论上讲,可以在提供任何密码或加密密钥进行验证之前触发该漏洞。
在 OpenSSH 9.0 中, compat_kex_proposal
看起来像这样(这里大大简化了):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
这个想法是调用者传入他们自己的内存块,其中包含一个建议密钥交换设置的文本字符串,然后返回批准使用他们发送的建议,或者一个新分配的文本字符串和更新的建议.
错误是如果条件 1 为假但条件 2 和 3 都为真,则代码分配 二 新文本字符串,但仅返回 一种.
分配的内存块 allocatenewstring1()
永远不会被释放,当函数返回时,它的内存地址永远丢失,所以任何代码都无法 free()
它在未来。
该块基本上被遗弃了,导致所谓的 内存泄漏.
随着时间的推移,这可能会引起麻烦,甚至可能迫使服务器关闭以从内存过载中恢复。
在 OpenSSH 9.1 中,代码已更新,试图避免分配两个字符串但放弃其中一个:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
这有 double-free 错误,因为如果条件 1 和条件 2 都为假,但条件 3 为真,那么代码会分配一个新的字符串作为它的答案发回……
…但错误地释放了调用者最初传入的字符串,因为函数 allocatenewstring1()
永远不会被调用来更新变量 suggestion
.
传入的建议字符串 是属于调用者的内存,因此调用者稍后会释放主题,从而导致双重释放的危险。
在 OpenSSH 9.2 中,代码变得更加谨慎,跟踪所有三个可能使用的内存块: suggestion
(其他人拥有的内存),以及可能在途中分配的两个可能的新字符串:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
如果条件 1 为真,则使用传入字符串的新副本,以便调用者稍后可以 free()
他们随时传入字符串的内存。
如果我们通过了条件 1,并且条件 2 为真但条件 3 为假,则由 allocatenewstring1()
被返回,并且传入 suggestion
字符串被单独留下。
如果条件 2 为假且条件 3 为真,则生成并返回一个新字符串,传入的 suggestion
字符串被单独留下。
如果条件 2 和条件 3 都为真,那么会分配两个新的字符串; 第一个被释放,因为它不需要; 第二个被退回; 和传入的 suggestion
字符串被单独留下。
您还可以 RTxM 确认如果你打电话 free(newone)
,尤其是 newone
is NULL
,那么“没有执行任何操作”,因为它总是安全的 free(NULL)
. 尽管如此,许多程序员仍然使用诸如 if (ptr != NULL) { free(ptr); }
.
怎么办呢?
正如 OpenSSH 团队所建议的那样,利用此错误将很困难,尤其是因为 sshd
程序在设置连接以供使用时具有。
尽管如此,他们还是将其报告为安全漏洞,因为事实就是如此,因此请确保您已更新到 OpenSSH 9.2.
如果你用 C 编写代码,请记住,无论你有多么有经验,内存管理都很容易出错......
……所以要小心。
(是的,Rust 和它的现代朋友会 帮助你写出正确的代码,但有时你仍然需要使用 C,甚至 Rust 也不能保证 阻止你写不正确的代码 如果你不明智地编程!)
- SEO 支持的内容和 PR 分发。 今天得到放大。
- 柏拉图区块链。 Web3 元宇宙智能。 知识放大。 访问这里。
- Sumber: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- 以上
- 绝对
- ACCESS
- 通
- 地址
- 采用
- 后
- 驳
- 算法
- 所有类型
- 分配
- 分配
- 允许
- 单
- 已经
- 替代
- 尽管
- 时刻
- 其中包括
- 和
- 另一个
- 应用领域
- 批准
- 澳大利亚人
- 认证
- 作者
- 汽车
- 可使用
- 避免
- 背部
- 背景
- 背景图像
- 因为
- 成为
- before
- 相信
- 最佳
- 阻止
- 吹氣梢
- 边界
- 半身裙/裤
- 问题
- 虫子
- 建立
- 呼叫
- 被称为
- 呼叫者
- 呼叫
- 关心
- 原因
- 造成
- 谨慎
- Center
- 当然
- 便宜
- 查
- 客户
- 码
- 编码器
- 采集
- 颜色
- COM的
- 如何
- 未来
- 商业的
- 组件
- 一台
- 流程条件
- 条件
- 确认
- 分享链接
- 已联繫
- 连接
- 地都
- 连接
- 包含
- 现代的
- 仿形
- 可以
- 课程
- 外壳
- 创建信息图
- 创建
- 创造
- 加密
- 危险
- data
- 天
- 一年中的
- 决定
- 专用
- 开发商
- 开发
- 设备
- DID
- 死
- 难
- 屏 显:
- 分配
- 分布
- 不会
- 双重自由
- 向下
- ,我们将参加
- 每
- 早
- 容易
- 有效
- 或
- 加密
- 结束
- 英国
- 整个
- 特别
- 本质上
- 甚至
- EVER
- 所有的
- 每个人
- 独家
- 体验
- 有经验
- 熟悉
- 特征
- 档
- 姓氏:
- 鱼
- 固定
- 缺陷
- 流
- 专注焦点
- 其次
- 如下
- 永远
- 发现
- Free
- 朋友
- 止
- ,
- 功能
- 进一步
- 未来
- 通常
- 产生
- 得到
- 巨人
- Go
- 非常好
- 非常
- 保证
- 守卫
- 客人
- 黑客
- 发生
- 硬
- 高度
- 此处
- 历史
- 击中
- 穿孔
- 主页
- 抱有希望
- 饭店
- 徘徊
- 创新中心
- HTML
- HTTPS
- 主意
- 立即
- 履行
- in
- 其他
- 包括
- 包含
- 包容
- 不正确
- 印度
- 即食类
- 代替
- 互动
- 网络
- 物联网
- 介绍
- 物联网
- 物联网(物联网)
- IT
- 本身
- 保持
- 键
- 知道
- 已知
- 缺乏
- 笔记本电脑
- 晚了
- 层
- 铅
- 领导
- 许可证
- 有限
- Line
- 友情链接
- Linux的
- 商标
- 不再
- 看
- 看着
- LOOKS
- 制成
- 主要
- 使
- 制作
- 管理
- 颠覆性技术
- 余量
- 问题
- 最大宽度
- 手段
- 内存
- 提到
- 微软
- 可能
- 错误
- 现代
- 更多
- 最先进的
- 姓名
- 命名
- 需求
- 打印车票
- 需要
- 网络
- 虽然
- 全新
- 正常
- 优惠精选
- 官方
- 一
- 打开
- 开放源码
- 操作
- 操作系统
- 操作
- 秩序
- 原版的
- 本来
- 其他名称
- 己
- 拥有
- 部分
- 部分
- 通过
- 通行证
- 密码
- 密码
- 过去
- 径
- 保罗
- 也许
- 电话
- 的
- 地方
- 平台
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 热门
- 位置
- 可能
- 帖子
- 准备
- 存在
- 呈现
- 以前
- 权限
- 大概
- 市场问题
- 过程
- 曲目
- 程序员
- 正确
- 协议
- 目的
- 很快
- 准备
- 真实
- 实时的
- 收到
- 最近
- 恢复
- 定期
- 释放
- 可靠
- 纪念
- 远程
- 通过远程访问
- 报告
- 报道
- 回报
- 回报
- 冒险的
- Room
- 运行
- 锈
- 安全
- 实现安全
- 同
- 科学家
- 屏风
- 其次
- 安全
- 保安
- 串行
- 特色服务
- 会议
- 招生面试
- 集
- 设置
- 格局
- 严重
- 壳
- 短
- 关闭
- 类似
- 简易
- 简
- 情况
- 潜行
- So
- 软件
- 固体
- 有人
- 东西
- 不久
- 来源
- 速度
- 钉鞋
- Spot
- 标准
- 看台
- 开始
- 仍
- 强烈
- 主题
- 这样
- 提示
- SUPPORT
- SVG的
- 系统
- 采取
- 团队
- 终端
- 该座
- 其
- 那里。
- 因此
- 事
- 思想
- 三
- 次
- 时
- 标题
- 至
- 今晚
- 工具
- 工具箱
- 工具
- 最佳
- 合计
- 跟踪时
- 过渡
- 透明
- 引发
- 麻烦
- true
- 信任
- 转
- 一般
- UNIX
- 更新
- 更新
- 网址
- 使用
- 用户
- 平时
- 验证
- 版本
- 通过
- 漏洞
- 通缉
- 知名
- 什么是
- 而
- WHO
- 广泛
- 将
- 窗户
- 也完全不需要
- 将
- 写
- 写作
- 书面
- 年
- 您一站式解决方案
- 和风网