主頁 >  其他 > Linux Capabilities 入門教程:概念篇

Linux Capabilities 入門教程:概念篇

2020-10-18 17:01:46 其他

原文鏈接:Linux Capabilities 入門教程:概念篇

Linux 是一種安全的作業系統,它把所有的系統權限都賦予了一個單一的 root 用戶,只給普通用戶保留有限的權限,root 用戶擁有超級管理員權限,可以安裝軟體、允許某些服務、管理用戶等,

作為普通用戶,如果想執行某些只有管理員才有權限的操作,以前只有兩種辦法:一是通過 sudo 提升權限,如果用戶很多,配置管理和權限控制會很麻煩;二是通過 SUID(Set User ID on execution)來實作,它可以讓普通用戶允許一個 owner 為 root 的可執行檔案時具有 root 的權限,

SUID 的概念比較晦澀難懂,舉個例子就明白了,以常用的 passwd 命令為例,修改用戶密碼是需要 root 權限的,但普通用戶卻可以通過這個命令來修改密碼,這就是因為 /bin/passwd 被設定了 SUID 標識,所以普通用戶執行 passwd 命令時,行程的 owner 就是 passwd 的所有者,也就是 root 用戶,

SUID 雖然可以解決問題,但卻帶來了安全隱患,當運行設定了 SUID 的命令時,通常只是需要很小一部分的特權,但是 SUID 給了它 root 具有的全部權限,這些可執行檔案是黑客的主要目標,如果他們發現了其中的漏洞,就很容易利用它來進行安全攻擊,簡而言之,SUID 機制增大了系統的安全攻擊面,

為了對 root 權限進行更細粒度的控制,實作按需授權,Linux 引入了另一種機制叫 capabilities

1. Linux capabilities 是什么?

Capabilities 機制是在 Linux 內核 2.2 之后引入的,原理很簡單,就是將之前與超級用戶 root(UID=0)關聯的特權細分為不同的功能組,Capabilites 作為執行緒(Linux 并不真正區分行程和執行緒)的屬性存在,每個功能組都可以獨立啟用和禁用,其本質上就是將內核呼叫分門別類,具有相似功能的內核呼叫被分到同一組中,

這樣一來,權限檢查的程序就變成了:在執行特權操作時,如果執行緒的有效身份不是 root,就去檢查其是否具有該特權操作所對應的 capabilities,并以此為依據,決定是否可以執行特權操作,

Capabilities 可以在行程執行時賦予,也可以直接從父行程繼承,所以理論上如果給 nginx 可執行檔案賦予了 CAP_NET_BIND_SERVICE capabilities,那么它就能以普通用戶運行并監聽在 80 埠上,

capability 名稱 描述
CAP_AUDIT_CONTROL 啟用和禁用內核審計;改變審計過濾規則;檢索審計狀態和過濾規則
CAP_AUDIT_READ 允許通過 multicast netlink 套接字讀取審計日志
CAP_AUDIT_WRITE 將記錄寫入內核審計日志
CAP_BLOCK_SUSPEND 使用可以阻止系統掛起的特性
CAP_CHOWN 修改檔案所有者的權限
CAP_DAC_OVERRIDE 忽略檔案的 DAC 訪問限制
CAP_DAC_READ_SEARCH 忽略檔案讀及目錄搜索的 DAC 訪問限制
CAP_FOWNER 忽略檔案屬主 ID 必須和行程用戶 ID 相匹配的限制
CAP_FSETID 允許設定檔案的 setuid 位
CAP_IPC_LOCK 允許鎖定共享記憶體片段
CAP_IPC_OWNER 忽略 IPC 所有權檢查
CAP_KILL 允許對不屬于自己的行程發送信號
CAP_LEASE 允許修改檔案鎖的 FL_LEASE 標志
CAP_LINUX_IMMUTABLE 允許修改檔案的 IMMUTABLE 和 APPEND 屬性標志
CAP_MAC_ADMIN 允許 MAC 配置或狀態更改
CAP_MAC_OVERRIDE 忽略檔案的 DAC 訪問限制
CAP_MKNOD 允許使用 mknod() 系統呼叫
CAP_NET_ADMIN 允許執行網路管理任務
CAP_NET_BIND_SERVICE 允許系結到小于 1024 的埠
CAP_NET_BROADCAST 允許網路廣播和多播訪問
CAP_NET_RAW 允許使用原始套接字
CAP_SETGID 允許改變行程的 GID
CAP_SETFCAP 允許為檔案設定任意的 capabilities
CAP_SETPCAP 參考 capabilities man page
CAP_SETUID 允許改變行程的 UID
CAP_SYS_ADMIN 允許執行系統管理任務,如加載或卸載檔案系統、設定磁盤配額等
CAP_SYS_BOOT 允許重新啟動系統
CAP_SYS_CHROOT 允許使用 chroot() 系統呼叫
CAP_SYS_MODULE 允許插入和洗掉內核模塊
CAP_SYS_NICE 允許提升優先級及設定其他行程的優先級
CAP_SYS_PACCT 允許執行行程的 BSD 式審計
CAP_SYS_PTRACE 允許跟蹤任何行程
CAP_SYS_RAWIO 允許直接訪問 /devport、/dev/mem、/dev/kmem 及原始塊設備
CAP_SYS_RESOURCE 忽略資源限制
CAP_SYS_TIME 允許改變系統時鐘
CAP_SYS_TTY_CONFIG 允許配置 TTY 設備
CAP_SYSLOG 允許使用 syslog() 系統呼叫
CAP_WAKE_ALARM 允許觸發一些能喚醒系統的東西(比如 CLOCK_BOOTTIME_ALARM 計時器)

2. capabilities 的賦予和繼承

Linux capabilities 分為行程 capabilities 和檔案 capabilities,對于行程來說,capabilities 是細分到執行緒的,即每個執行緒可以有自己的capabilities,對于檔案來說,capabilities 保存在檔案的擴展屬性中,

下面分別介紹執行緒(行程)的 capabilities 和檔案的 capabilities,

執行緒的 capabilities

每一個執行緒,具有 5 個 capabilities 集合,每一個集合使用 64 位掩碼來表示,顯示為 16 進制格式,這 5 個 capabilities 集合分別是:

  • Permitted
  • Effective
  • Inheritable
  • Bounding
  • Ambient

每個集合中都包含零個或多個 capabilities,這5個集合的具體含義如下:

Permitted

定義了執行緒能夠使用的 capabilities 的上限,它并不使能執行緒的 capabilities,而是作為一個規定,也就是說,執行緒可以通過系統呼叫 capset() 來從 EffectiveInheritable 集合中添加或洗掉 capability,前提是添加或洗掉的 capability 必須包含在 Permitted 集合中(其中 Bounding 集合也會有影響,具體參考下文), 如果某個執行緒想向 Inheritable 集合中添加或洗掉 capability,首先它的 Effective 集合中得包含 CAP_SETPCAP 這個 capabiliy,

Effective

內核檢查執行緒是否可以進行特權操作時,檢查的物件便是 Effective 集合,如之前所說,Permitted 集合定義了上限,執行緒可以洗掉 Effective 集合中的某 capability,隨后在需要時,再從 Permitted 集合中恢復該 capability,以此達到臨時禁用 capability 的功能,

Inheritable

當執行exec() 系統呼叫時,能夠被新的可執行檔案繼承的 capabilities,被包含在 Inheritable 集合中,這里需要說明一下,包含在該集合中的 capabilities 并不會自動繼承給新的可執行檔案,即不會添加到新執行緒的 Effective 集合中,它只會影響新執行緒的 Permitted 集合,

Bounding

Bounding 集合是 Inheritable 集合的超集,如果某個 capability 不在 Bounding 集合中,即使它在 Permitted 集合中,該執行緒也不能將該 capability 添加到它的 Inheritable 集合中,

Bounding 集合的 capabilities 在執行 fork() 系統呼叫時會傳遞給子行程的 Bounding 集合,并且在執行 execve 系統呼叫后保持不變,

  • 當執行緒運行時,不能向 Bounding 集合中添加 capabilities,
  • 一旦某個 capability 被從 Bounding 集合中洗掉,便不能再添加回來,
  • 將某個 capability 從 Bounding 集合中洗掉后,如果之前 Inherited 集合包含該 capability,將繼續保留,但如果后續從 Inheritable 集合中洗掉了該 capability,便不能再添加回來,

Ambient

Linux 4.3 內核新增了一個 capabilities 集合叫 Ambient ,用來彌補 Inheritable 的不足,Ambient 具有如下特性:

  • PermittedInheritable 未設定的 capabilities,Ambient 也不能設定,
  • PermittedInheritable 關閉某權限(比如 CAP_SYS_BOOT)后,Ambient 也隨之關閉對應權限,這樣就確保了降低權限后子行程也會降低權限,
  • 非特權用戶如果在 Permitted 集合中有一個 capability,那么可以添加到 Ambient 集合中,這樣它的子行程便可以在 AmbientPermittedEffective 集合中獲取這個 capability,現在不知道為什么也沒關系,后面會通過具體的公式來告訴你,

Ambient 的好處顯而易見,舉個例子,如果你將 CAP_NET_ADMIN 添加到當前行程的 Ambient 集合中,它便可以通過 fork()execve() 呼叫 shell 腳本來執行網路管理任務,因為 CAP_NET_ADMIN 會自動繼承下去,

檔案的 capabilities

檔案的 capabilities 被保存在檔案的擴展屬性中,如果想修改這些屬性,需要具有 CAP_SETFCAP 的 capability,檔案與執行緒的 capabilities 共同決定了通過 execve() 運行該檔案后的執行緒的 capabilities,

檔案的 capabilities 功能,需要檔案系統的支持,如果檔案系統使用了 nouuid 選項進行掛載,那么檔案的 capabilities 將會被忽略,

類似于執行緒的 capabilities,檔案的 capabilities 包含了 3 個集合:

  • Permitted
  • Inheritable
  • Effective

這3個集合的具體含義如下:

Permitted

這個集合中包含的 capabilities,在檔案被執行時,會與執行緒的 Bounding 集合計算交集,然后添加到執行緒的 Permitted 集合中,

Inheritable

這個集合與執行緒的 Inheritable 集合的交集,會被添加到執行完 execve() 后的執行緒的 Permitted 集合中,

Effective

這不是一個集合,僅僅是一個標志位,如果設定開啟,那么在執行完 execve() 后,執行緒 Permitted 集合中的 capabilities 會自動添加到它的 Effective 集合中,對于一些舊的可執行檔案,由于其不會呼叫 capabilities 相關函式設定自身的 Effective 集合,所以可以將可執行檔案的 Effective bit 開啟,從而可以將 Permitted 集合中的 capabilities 自動添加到 Effective 集合中,

詳情請參考 Linux capabilities 的 man page,

3. 運行 execve() 后 capabilities 的變化

上面介紹了執行緒和檔案的 capabilities,你們可能會覺得有些抽象難懂,下面通過具體的計算公式,來說明執行 execve() 后 capabilities 是如何被確定的,

我們用 P 代表執行 execve() 前執行緒的 capabilities,P' 代表執行 execve() 后執行緒的 capabilities,F 代表可執行檔案的 capabilities,那么:

P'(ambient) = (file is privileged) ? 0 : P(ambient)

P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding))) | P'(ambient)

P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)

P'(inheritable) = P(inheritable) [i.e., unchanged]

P'(bounding) = P(bounding) [i.e., unchanged]

我們一條一條來解釋:

  • 如果用戶是 root 用戶,那么執行 execve() 后執行緒的 Ambient 集合是空集;如果是普通用戶,那么執行 execve() 后執行緒的 Ambient 集合將會繼承執行 execve() 前執行緒的 Ambient 集合,

  • 執行 execve() 前執行緒的 Inheritable 集合與可執行檔案的 Inheritable 集合取交集,會被添加到執行 execve() 后執行緒的 Permitted 集合;可執行檔案的 capability bounding 集合與可執行檔案的 Permitted 集合取交集,也會被添加到執行 execve() 后執行緒的 Permitted 集合;同時執行 execve() 后執行緒的 Ambient 集合中的 capabilities 會被自動添加到該執行緒的 Permitted 集合中,

  • 如果可執行檔案開啟了 Effective 標志位,那么在執行完 execve() 后,執行緒 Permitted 集合中的 capabilities 會自動添加到它的 Effective 集合中,

  • 執行 execve() 前執行緒的 Inheritable 集合會繼承給執行 execve() 后執行緒的 Inheritable 集合,

這里有幾點需要著重強調:

  1. 上面的公式是針對系統呼叫 execve() 的,如果是 fork(),那么子執行緒的 capabilities 資訊完全復制父行程的 capabilities 資訊,

  2. 可執行檔案的 Inheritable 集合與執行緒的 Inheritable 集合并沒有什么關系,可執行檔案 Inheritable 集合中的 capabilities 不會被添加到執行 execve() 后執行緒的 Inheritable 集合中,如果想讓新執行緒的 Inheritable 集合包含某個 capability,只能通過 capset() 將該 capability 添加到當前執行緒的 Inheritable 集合中(因為 P'(inheritable) = P(inheritable)),

  3. 如果想讓當前執行緒 Inheritable 集合中的 capabilities 傳遞給新的可執行檔案,該檔案的 Inheritable 集合中也必須包含這些 capabilities(因為 P'(permitted)   = (P(inheritable) & F(inheritable))|...),

  4. 將當前執行緒的 capabilities 傳遞給新的可執行檔案時,僅僅只是傳遞給新執行緒的 Permitted 集合,如果想讓其生效,新執行緒必須通過 capset() 將 capabilities 添加到 Effective 集合中,或者開啟新的可執行檔案的 Effective 標志位(因為 P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)),

  5. 在沒有 Ambient 集合之前,如果某個腳本不能呼叫 capset(),但想讓腳本中的執行緒都能獲得該腳本的 Permitted 集合中的 capabilities,只能將 Permitted 集合中的 capabilities 添加到 Inheritable 集合中(P'(permitted)  = P(inheritable) & F(inheritable)|...),同時開啟 Effective 標志位(P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)),有 有 Ambient 集合之后,事情就變得簡單多了,后續的文章會詳細解釋,

  6. 如果某個 UID 非零(普通用戶)的執行緒執行了 execve(),那么 PermittedEffective 集合中的 capabilities 都會被清空,

  7. 從 root 用戶切換到普通用戶,那么 PermittedEffective 集合中的 capabilities 都會被清空,除非設定了 SECBIT_KEEP_CAPS 或者更寬泛的 SECBIT_NO_SETUID_FIXUP,

關于上述計算公式的邏輯流程圖如下所示(不包括 Ambient 集合):

4. 簡單示例


下面我們用一個例子來演示上述公式的計算邏輯,以 ping 檔案為例,如果我們將 CAP_NET_RAW capability添加到 ping 檔案的 Permitted 集合中(F(Permitted)),它就會添加到執行后的執行緒的 Permitted 集合中(P'(Permitted)),由于 ping 檔案具有 capabilities 意識,即能夠呼叫 capset()capget() ,它在運行時會呼叫 capset()CAP_NET_RAW capability 添加到執行緒的 Effective 集合中,

換句話說,如果可執行檔案不具有 capabilities 意識,我們就必須要開啟 Effective 標志位(F(Effective)),這樣就會將該 capability 自動添加到執行緒的 Effective 集合中,具有capabilities 意識的可執行檔案更安全,因為它會限制執行緒使用該 capability 的時間,

我們也可以將 capabilities 添加到檔案的 Inheritable 集合中,檔案的 Inheritable 集合會與當前執行緒的 Inheritable 集合取交集,然后添加到新執行緒的 Permitted 集合中,這樣就可以控制可執行檔案的運行環境,

看起來很有道理,但有一個問題:如果可執行檔案的有效用戶是普通用戶,且沒有 Inheritable 集合,即 F(inheritable) = 0,那么 P(inheritable) 將會被忽略(P(inheritable) & F(inheritable)),由于絕大多數可執行檔案都是這種情況,因此 Inheritable 集合的可用性受到了限制,我們無法讓腳本中的執行緒自動繼承該腳本檔案中的 capabilities,除非讓腳本具有 capabilities 意識

要想改變這種狀況,可以使用 Ambient 集合,Ambient 集合會自動從父執行緒中繼承,同時會自動添加到當前執行緒的 Permitted 集合中,舉個例子,在一個 Bash 環境中(例如某個正在執行的腳本),該環境所在的執行緒的 Ambient 集合中包含 CAP_NET_RAW capability,那么在該環境中執行 ping 檔案可以正常作業,即使該檔案是普通檔案(沒有任何 capabilities,也沒有設定 SUID),

5. 終極案例

最后拿 docker 舉例,如果你使用普通用戶來啟動官方的 nginx 容器,會出現以下錯誤:

bind() to 0.0.0.0:80 failed (13: Permission denied)

因為 nginx 行程的 Effective 集合中不包含 CAP_NET_BIND_SERVICE capability,且不具有 capabilities 意識(普通用戶),所以啟動失敗,要想啟動成功,至少需要將該 capability 添加到 nginx 檔案的 Inheritable 集合中,同時開啟 Effective 標志位,并且在 Kubernetes Pod 的部署清單中的 securityContext --> capabilities 欄位下面添加 NET_BIND_SERVICE(這個 capability 會被添加到 nginx 行程的 Bounding 集合中),最后還要將 capability 添加到 nginx 檔案的 Permitted 集合中,如此一來就大功告成了,參考公式:P'(permitted) = ...|(F(permitted) & P(bounding)))|...P'(effective) = F(effective) ? P'(permitted) : P'(ambient)

如果容器開啟了 securityContext/allowPrivilegeEscalation,上述設定仍然可以生效,如果 nginx 檔案具有 capabilities 意識,那么只需要將 CAP_NET_BIND_SERVICE capability 添加到它的 Inheritable 集合中就可以正常作業了,

當然了,除了上述使用檔案擴展屬性的方法外,還可以使用 Ambient 集合來讓非 root 容器行程正常作業,但 Kubernetes 目前還不支持這個屬性,具體參考 Kubernetes 專案的 issue,

雖然 Kubernetes 官方不支持,但我們可以自己來實作,具體實作方式可以關注我后續的文章,

6. 參考資料

  • Linux Capabilities: Why They Exist and How They Work
  • Understanding Capabilities in Linux
  • Linux Capabilities in a nutshell
  • Linux的capabilities機制

微信公眾號

掃一掃下面的二維碼關注微信公眾號,在公眾號中回復?加群?即可加入我們的云原生交流群,和孫宏亮、張館長、陽明等大佬一起探討云原生技術

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/178329.html

標籤:其他

上一篇:零基礎教程!一文教你使用Rancher 2.3和Terraform運行Windows容器

下一篇:Dubbo 在 K8s 下的思考

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more