第17章 设备与模块

关于设备驱动和设备管理,讨论四种内核成分。

  • 设备类型:在所有的linux系统中为了统一普遍设备的操作所分的类。
  • 模块:Linux内核中用于按需加载和卸载目标码的机制。
  • 内核对象:内核数据机构中支持面向对象的简单操作,还支持维护对象间的父子关系。
  • sysfs:表示系统中设备树的一个文件系统

一、设备类型

在Linux以及所有Unix系统中,设备被分为一下三种类型:

  • 块设备
  • 字符设备
  • 网络设备
  1. 块设备通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同而不同;通常支持重定位操作,也就是对数据的随机访问。
  2. 字符设备通常缩写为cdev,它是不可寻址的,仅提供数据的流式访问。
  3. 网络设备最常见的类型有时也以以太网设备来称呼,他提供了对网络的访问,这是通过一个物理适配器和一种特定的协议进行的。网络设备是通过套接字API这样的特殊接口来访问的。

二、模块

尽管Linux是“单块内核”的操作系统,这是说整个系统内核都运行于一个单独的保护域中,但是Linux内核是模块化组成的,它允许内核在运行时动态地向其中插入或从中删除代码。这些代码被一并组合在一个单独的二进制镜像中,即所谓的可装载内核模块中,或简称模块。支持模块的好处是基本内核镜像可以尽可能的小,因为可选的功能和驱动程序可以利用模块形式再提供。模块允许我们方便地删除和重新载入内核代码,也方便了调试工作。

三、设备模型

  1. 设备模型的核心部分就是kobject,类似于c#或Java这些面向对象语言中的对象类,提供了诸如引用计数、名称和父指针等字段,可以创建对象的层次结构。
  2. kobject对象被关联到一种特殊的类型,即ktype。ktype的存在是为了描述一族kobject所具有的普遍特性。如此一来,不再需要每个kobject都分别定义自己的特性,而是将这些普遍特性在ktype结构中一次定义,然后所有同类的kobject都能共享一样的特性。
  3. kset是kobject对象的集合体。kset可把kobject集中到一个集合中,而ktype描述相关类型kobject所共有的特性,它们之间的重要区别在于:具有相同的ktype的kobject可以被分组到不同的kset。就是说,在Linux内核中,只有少数的ktype,却有多个kset。

四、sysfs

sys文件系统是一个处于内存中的虚拟文件系统,它为我们提供了kobject对象层次结构的视图。

sysfs的诀窍是把kobject对象与目录项紧密联系起来,这点是通过kobject对象中的denty字段实现的。

第19章 可移植性

关于字长和数据类型的一些准则:

  • ANSIC标准规定,一个char的长度一定是1字节
  • 尽管没有规定int类型的长度是32位,但在Linux当前支持的体系结构中,它都是32位的。
  • short类型也类似,在当前所有支持的体系结构中,虽然没有明文规定,但是它都是16位的。
  • 绝对不应该假定指针和long的长度,在linux当前支持的体系结构中,它们可以在32位和64位中变化。
  • 对于不同的体系结构long的长度不同,决不应该假设sizeof(int)=sizeof(long)。
  • 类似的,也不要假设指针和int长度相等。

要想写出移植性好、简洁、合适的内核代码,要注意以下两点:

  1. 编码尽量选取最大公因子:假定任何事情都可能发生,任何潜在的约束都可能存在。

  2. 编码尽量选取最小公约数:不要假定给定的内核特性是可用的,仅仅需要最小的体系结构功能。

    编写可移植性的代码需要考虑很多问题:字长、数据类型、填充、对齐、字节次序、符号、字节顺序、页大小以及处理器的加载/存储排序等。对于绝大多数的内核开发者来说,可能主要考虑的问题就是保证正确使用数据类型。

第20章 补丁,开发和社区

Linux编码风格:

  • 缩进——缩进风格是用制表位每次缩进8个字符长度。
  • switch语句——switch语句下属的case标记应该缩进到和switch声明对齐,这样有助于减少8个字符的tab键带来的排版缩进。
  • 空格——Linux编码风格规定,空格放在关键字周围,函数名和圆括号之间无空格。
  • 花括号——内核选定的风格是左括号紧跟在语句的最后,与语句在相同的一行。而右括号要新起一行,作为该行的第一个字符。
  • 每行代码的长度——源代码中要尽可能地保证每行代码长度不超过80个字符,因为这样做可能使代码最合适在标准的80*24的终端上显示。
  • 命名规范——命名中不允许使用骆驼拼写法、Studly Caps或者其他混合的大小写字符。
  • 函数——根据经验,函数的代码长度不应该超过两屏,局部变量不应超过10个。一个函数应该功能单一而且实现精确。
  • 注释——一般情况下应该描述的是你的代码要做什么和为什么要这样做,而不是具体通过什么方式实现的。
  • typedef——使用typedef要谨慎,只有在确实需要的时候再使用它。
  • 多用现成的东西——请勿闭门造车。内核本身就提供了字符串操作函数,压缩函数和一个链表接口,所以请使用他们。
  • 在源码中减少使用ifdef——不赞成在源码中使用ifdef预处理指令。
  • 结构初始化——结构初始化的时候必须在他的成员前加上结构标识符。
  • 代码的事后修正——indent是一个在大多数Linux系统中都能找到的好工具,它可以按照指定的方式对源代码进行格式化。

实验部分

2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发。

什么是shellshock:Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开。许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash版本上执行任意代码。Bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell。这可使攻击者在未授权的情况下访问计算机系统。

实验准备

以root权限安装4.1版bash

下载:

# wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz

安装:

# tar xf bash-4.1.tar.gz
# cd bash-4.1
# ./configure
# make & make install

./configure的作用是检测系统配置,生成makefile文件,以便你可以用make和make install来编译和安装程序。

链接:

# rm /bin/bash
# ln -s /usr/local/bin/bash /bin/bash



到这里就安装完了,接下来检测是否存在shellshock漏洞。

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test "

-c参数,则bash从字符串中读入命令。bash -c "echo this is a test"在执行的时候存在一个环境变量x,而x呢等于 () { :;}; echo vulnerable ,我们都知道环境变量在使用前都会被初始化,那么 () { :;}; echo vulnerable 就自然而然的被执行了。 () { :;}; 定义了一个函数(function)并且它什么也不做,而后的 echo vulnerable 被解析后得到了执行权。那么 echo vulnerable 换成其他更具破坏性的代码后果就不堪设想了。

输出vulnerable的话,说明bash有漏洞。

最后,让/bin/sh 指向/bin/bash.

$ sudo ln -sf /bin/bash /bin/sh

-s是创建软连接,-f是强制创建,软连接相当于一个快捷方式。

了解bash自定义函数,只需要函数名就能够调用该函数。

$ foo() { echo bar; }
$ foo
> bar

这个时候的Bash的环境变量:

KEY = foo
VALUE = () { echo bar; }

用$ echo 查看环境变量。

来看看ShellShock漏洞的真身:

export foo=’() { :; }; echo Hello World’
bash
>Hello World

export设置环境变量。

为什么调用bash的时候输出Hello World了呢?瞧瞧他内部的情况:

KEY = foo
VALUE = () { :; }; echo Hello World

bash读取了环境变量,在定义foo之后直接调用了后面的函数。 一旦调用bash,自定义的语句就直接触发。

攻击Set-UID程序

本实验中,我们通过攻击Set-UID程序来获得root权限。Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。 一个文件都有一个所有者, 表示该文件是谁创建的。同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组。setuid: 设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码。首先,确保安装了带有漏洞的bash版本,并让/bin/sh 指向/bin/bash.

$ sudo ln -sf /bin/bash /bin/sh

请编译下面这段代码,并设置其为Set-UID程序,保证它的所有者是root。我们知道system()函数将调用"/bin/sh -c" 来运行指定的命令, 这也意味着/bin/bash 会被调用。

#include <stdio.h>
void main()
{
setuid(geteuid()); // make real uid = effective uid.
system("/bin/ls -l");
}

system:运行外部函数。real UID是标记谁调用了该可执行文件;effective UID表示该可执行程序所具有的权限的用户;默认情况下real UID和effective UID一样,但是当使用了setUID之后,两者有可能不一样。例如passwd程序,当你执行这个程序的时候,它的real UID就是调用passwd的用户,这个用户可能是root,也可能是任何普通用户;但是它的effective UID是root,只有这样passwd程序才能修改/etc/passwd文件。

我们注意到这里使用了setuid(geteuid()) 来使real uid = effective uid。

如果 setuid(geteuid()) 语句被去掉了,再试试看攻击,我们还能够拿到权限么?

#include <stdio.h>
void main()
{
system("/bin/ls -l");
}

失败了!这就说明如果 real uid 和 effective uid 相同的话,定义在环境变量中的内容在该程序内有效,那样shellshock漏洞就能够被利用了。但是如果两个uid不同的话,环境变量失效,就无法发动攻击了。

20169210《Linux内核原理与分析》第十一周作业的更多相关文章

  1. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  2. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  3. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  4. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  5. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. SecureCRT+WinSCP 共用 key pub 密钥 转换 ppk 登录ssh

    使用SecureCRT生成的密钥,无法在WinSCP使用, 使用puttygen.exe无法直接转换,解决办法 1.使用大于等于SecureCRT6.5版本,来转换 记得放入私钥,不是pub公钥.然后 ...

  2. Datadog Agent是啥?它消耗什么资源?

    在资本市场不那么喜人的 2015 年融资 9450 万美元的 Datadog,在运维圈刮起了一阵小旋风.作为国外很值得学习的一款平台监控产品,公司人数不足 100 的 Datadog 为什么吸引了投资 ...

  3. HDU 1171 Big Event in HDU(DP)

    点我看题目 题意 : 给你一个n,然后n组数据,每组两个数字,一个是物品的价值,另外一个是物品的数量,让你尽量将这些东西分成价值相等的两份,如果无法相等就前一份要大于后一份. 思路 :这个题可以转化成 ...

  4. 深入WSGI,并按样例实现一个

    感觉WSGI确实和SERVLET相似,为PYTHON提供了运行和管理环境.WSGI服务器和PYTHON的WEB框架一起,实现WEB响应. 步骤: 首先,服务器启动并加载一个由Web框架/应用提供的可调 ...

  5. su: /bin/bash: Permission denied

    https://bbs.archlinux.org/viewtopic.php?id=105541 New user created as: groupadd mygroupuseradd -s /b ...

  6. 解决eclipse+tomcat7的中文乱码的一个方法

    我用的eclipse+tomcat7进行开发部署个一个项目,在页面展示的时候出现中文乱码,我想尽了所有方法,eclipse开发环境可以配置成utf-8的地方都进行了配置,tomcat也进行了配置URI ...

  7. jacob访问ocx控件方法和遇到的问题

    最近在进行摄像机的二次开发,摄像机厂商提供了使用C++开发的ocx控件:所以尝试使用jacob来进行访问. 操作步骤如下: 1, 从官网(http://sourceforge.net/projects ...

  8. CDC 虚拟com口

    现在很多电脑已经不带232了,特别是手提电脑.这使很多使用手提在外调试人员非常不方便.或许你可以买一条市面上usb转232转换线,但这些线抗干扰不是太好,在一些干扰大的地方会发生连接中断的问题,所以往 ...

  9. Visual Studio原生开发的10个调试技巧(转)

    本文由 伯乐在线 - JingerJoe 翻译自 Marius Bancila.转载请参见文章末尾处的要求.   [感谢@_La_Isla_Bonita 的热心翻译.如果其他朋友也有不错的原创或译文, ...

  10. Android开发UI之控件-Android-PullToRefresh

    下拉刷新,使用的是Android-PullToRefresh,Github--https://github.com/chrisbanes/Android-PullToRefresh PullToRef ...