Potential bypass of Runas user restrictions Custom Search

Release Date:
October 14, 2019
Summary:
When sudo is configured to allow a user to run commands as an arbitrary user via the ALL keyword in a Runas specification, it is possible to run commands as root by specifying the user ID -1 or 4294967295.
This can be used by a user with sufficient sudo privileges to run commands as root even if the Runas specification explicitly disallows root access as long as the ALL keyword is listed first in the Runas specification.

Log entries for commands run this way will list the target user as 4294967295 instead of root. In addition, PAM session modules will not be run for the command.

Sudo versions affected:
Sudo versions prior to 1.8.28 are affected.

CVE ID:
This vulnerability has been assigned CVE-2019-14287 in the Common Vulnerabilities and Exposures database.
Details:
Exploiting the bug requires that the user have sudo privileges that allow them to run commands with an arbitrary user ID. Typically, this means that the user's sudoers entry has the special value ALL in the Runas specifier.
Sudo supports running a command with a user-specified user name or user ID, if permitted by the sudoers policy. For example, the following sudoers entry allow the id command to be run as any user because it includes the ALL keyword in the Runas specifier.

    myhost alice = (ALL) /usr/bin/id

Not only is user is able to run the id command as any valid user, she is also able to run it as an arbitrary user ID by using the #uid syntax, for example:

    sudo -u#1234 id -u

would return 1234. However, the setresuid(2) and setreuid(2) system calls, which sudo uses to change the user ID before running the command, treat user ID -1 (or its unsigned equivalent 4294967295), specially and do not change the user ID for this value. As a result,

    sudo -u#-1 id -u

or

    sudo -u#4294967295 id -u

will actually return 0. This is because the sudo command itself is already running as user ID 0 so when sudo tries to change to user ID -1, no change occurs.
This results in sudo log entries that report the command as being run by user ID 4294967295 and not root (or user ID 0). Additionally, because the user ID specified via the -u option does not exist in the password database, no PAM session modules will be run.

If a sudoers entry is written to allow the user to run a command as any user except root, the bug can be used to avoid this restriction. For example, given the following sudoers entry:

    myhost bob = (ALL, !root) /usr/bin/vi

User bob is allowed to run vi as any user but root. However, due to the bug, bob is actually able to run vi as root by running sudo -u#-1 vi, violating the security policy.
Only sudoers entries where the ALL keyword is present in the Runas specifier are affected. For example, the following sudoers entry is unaffected:

    myhost alice = /usr/bin/id

In this example, alice is only allowed to run the id command as root. Any attempt to run the command as a different user will be denied.
Fix:
The bug is fixed in sudo 1.8.28.
Credit:
Joe Vennix from Apple Information Security found and analyzed the bug.

Python常用英文单词

一、交互式环境与print输出

1、print:打印/输出
2、coding:编码
3、syntax:语法
4、error:错误
5、invalid:无效
6、identifier:名称/标识符
7、character :字符

二、字符串的操作

1、user:用户
2、name:姓名/名称
3、attribute:字段/属性
4、value:值
5、key:键

三、重复/转换/替换/原始字符串

1、upper:上面
2、lower:下面
3、capitalize:用大写字母写或印刷
4、title:标题
5、replace:替换
6、old:旧的
7、new:新的
8、count:计数
9、swap:互换
10、case:情形
11、path:路径
12、new:新的\新建
13、project:项目
14、test:测试
15、file:文件
16、data:数据

四、去除/查询/计数

1、strip:去除
2、index:索引
3、find:查找
4、count:计数
5、start:开始
6、end:结束
7、chars:字符
8、sub:附属

五、获取输入/格式化

1、input:输入
2、prompt:提示
3、ID:身份证
4、format:格式化
5、args(argument):参数
6、kwargs:关键字参数
7、year:年
8、month:月
9、day:日

六、元组

1、tuple:元组
2、max:最大
3、min:最小
4、iterable:可迭代
5、key:关键字
6、function:方法/函数
7、stop:停止
8、object:对象

七、列表

1、list:列表
2、reverse:反向
3、true:真
4、false:假
5、append:附加
6、extend:扩展
7、insert:插入
8、pop:取出
9、remove:移除
10、del(delete):删除
11、clear:清除
12、sort:排序

八、集合

1、set:集合/设置
2、add:添加
3、update:更新
4、discard:丢弃
5、intersection:相交
6、union:联合
7、difference:差数
8、symmetric:对称
9、in:在…里面
10、not:不/不是
11、disjoint:不相交
12、subset:子集
13、superset:父集/超集
14、copy:复制

九、字典

1、dict:字典
2、key:键/关键字
3、value:值
4、item:项
5、mapping:映射
6、seq(sequence):序列
7、from:从/来自
8、get:获取
9、default:默认
10、none:没有
11、arg:可变元素
12、kwargs(keyword args):可变关键字元素

十、循环

1、for…in…循环的使用
2、while…循环的使用
3、range:范围
4、sep(separate):分隔
5、flush:冲刷
6、step:步长
7、continue:继续
8、break:突破/跳出

十一、条件/跳出与结束循环

1、if:如果
2、else:否则

十二、运算符与随机数

1、module:模块
2、sys(system):系统
3、path:路径
4、import:导入
5、from:从…

十三、定义函数与设定参数

1、birthday:出生日期
2、year:年份
3、month:月份
4、day:日期
5、type:类型
6、error:错误
7、missing:丢失
8、required:必须
9、positional:位置
10、unsupported:不支持

十四、设定收集参数

1、create:创建
2、info:信息
3、age:年龄
4、height:高度
5、width:宽度
6、weight:重量
7、splicing:拼接
8、params:参数
9、volume:体积
11、operand:操作数

十五、嵌套函数/作用域/闭包

1、inside:内部
2、outside:外部
3、radius:半径
4、perimeter:周长
5、case:情形
6、synthesis:合成
7、execute:执行

十六、递归函数

1、recursion:递归
2、Infinite:无穷
3、maximum:最大值
4、depth:深度
5、exceeded:超过
6、factorial:阶乘
7、search:查询
8、power:幂
9、lower:下方
10、upper:上方
11、middle:中间
12、assert/assertion:异常

十七、列表推导式/lambda表达式

1、square:平方
2、even:偶数
3、comprehension:理解
4、lambda:希腊字母λ的英文名称,大名鼎鼎的游戏半条命里面的logo就是这个。

十八、列表推导式/lambda表达式

1、regular:规则
2、expression: 表达式
3、group:组
4、match:匹配
5、span:跨度
6、ignore case:忽略 大小写
7、multi line:多 行
8、dot all:点 全部
9、unicode:万国码
10、verbose:累赘
11、pos/position:位置

分类: Python | 留下评论

使用screen管理远程会话

在ssh远程登录后,经常遇到为每一个任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。那是因为SIGHUP信号导致了程序的终止。

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。

会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。

会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。如果会话期首进程终止,则该信号发送到该会话期前台进程组。一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。
nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

nohup [argument…] &
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

其实我们可以使用一个更为强大的实用程序screen

Screen

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

多窗口

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

会话共享

Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

GNU's Screen 官方站点:

http://www.gnu.org/software/screen/

语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数说明
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

#### 常用screen参数

screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。

C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁

C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9

C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。

C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load

C-a k -> kill window,强行关闭当前的 window

C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

#### screen 会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[root@TS-DEV ~]# screen -x

这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

#### 屏幕分割

现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。

使用快捷键:
C-a S 将显示器水平分割
C-a | 垂直分屏,分屏以后也可以使用(Screen 4.00.03以后版本)
C-a 在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。
C-a X 快捷键关闭当前焦点所在的屏幕区块
C-a Q 关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。