如何控制特权命令?

时间:2016-11-02 11:07:42

标签: linux bash sudo user-permissions superuser

如果命令对每个人都有执行权限,操作系统如何阻止普通用户执行fdisk和umount等命令?

WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient() {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return false;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        createWebPrintJob(view);
    }
});

WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);

webView.loadDataWithBaseURL(null, htmlDocument,
            "text/HTML", "UTF-8", null);
private void createWebPrintJob(WebView webView) {
    PrintManager printManager = (PrintManager) this
            .getSystemService(Context.PRINT_SERVICE);

    PrintDocumentAdapter printAdapter;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        printAdapter = webView.createPrintDocumentAdapter("");
    } else {
        //noinspection deprecation
        printAdapter = webView.createPrintDocumentAdapter();
    }

    String jobName = getString(R.string.app_name) + " Print Test";

    PrintAttributes printAttrs = new PrintAttributes.Builder().
            setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME).
            setMinMargins(new PrintAttributes.Margins(0, 5000, 0, 0)).
            build();

    PrintJob printjob = printManager.print(jobName, printAdapter,
            printAttrs);
}

1 个答案:

答案 0 :(得分:1)

在某些情况下可能值得禁止用户执行任何二进制文件(我认为它可能是针对权限提升漏洞利用的对策之一)。但是在许多情况下,普通用户可以执行自己的二进制文件,那么如果用户自己编写和编译fdisk或类似的东西呢?实际上,您不希望禁止用户运行fdisk。您只是想禁止fdisk或任何其他程序以某种方式修改系统状态。因此,普通用户可以执行 fdisk

$ fdisk --help
Usage:
 fdisk [options] <disk>      change partition table
 fdisk [options] -l [<disk>] list partition table(s)
...

普通用户实际上不能做的是执行受限操作:

$ fdisk /dev/sda
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
fdisk: cannot open /dev/sda: Permission denied

所以fdisk成功启动,打印了一些消息。然后它尝试打开原始磁盘设备/dev/sda,这个操作确实受到权限的限制,因此fdisk只是抱怨说它无法执行任何操作并退出。

但是,在某些情况下,某些用户可能希望限制某些二进制文件的可执行性。当管理员或操作系统维护人员希望普通用户能够执行某些特权操作时(例如在/etc/fstab中安装某个特定用户允许的某个分区),他们会设置一些特殊的强化二进制文件,例如具有set-user-ID权限的mountsudo

$ ls -l /bin/mount /usr/bin/sudo
-rwsr-xr-x 1 root root  40152 May 27 02:31 /bin/mount
-rwsr-xr-x 1 root root 136808 Aug 17 16:20 /usr/bin/sudo

当执行这样的二进制文件时,内核不会给它调用用户的用户ID,但在这种情况下, UID 0(root )。因为普通用户不能以这种方式设置二进制文件(root owner和set-UID bit set),所以理论上值得限制这些二进制文件对某个特定组的可执行性(但在上述情况下,它们是世界可执行的并且检查权限我不知道,如果不能以某种方式规避set-UID可执行文件的可执行性限制,以及某人是否真的广泛使用这种方法,那么我真的不知道。

还有一个注意事项:如果系统上有fdisk,则会将其安装到/usr/sbin目录,该目录可能位于常规用户的 PATH 变量中,所以fdisk可能会或可能不会由普通用户执行,只需在命令提示符下键入fdisk,但它实际上不是限制(可以简单地指定命令行上可执行文件的完整路径)。