的屬性:三個(gè)平臺(tái)各叫什么)
授權(quán)與合規(guī)聲明本文全部操作對(duì)象均為自建隔離靶場(chǎng)本機(jī)容器或隔離虛擬機(jī)涉及安全測(cè)試的環(huán)節(jié)必須以取得合法授權(quán)為前提。未經(jīng)授權(quán)的滲透測(cè)試違反《中華人民共和國(guó)網(wǎng)絡(luò)安全法》與《刑法》相關(guān)條款須承擔(dān)相應(yīng)法律責(zé)任。本文只講環(huán)境配置、版本對(duì)照與靶場(chǎng)隔離不含任何攻擊步驟、利用載荷與繞過(guò)手法請(qǐng)勿將文中環(huán)境指向任何非自有系統(tǒng)。一、ls -l之后還有一層沒(méi)顯示1.1 權(quán)限位后面那個(gè)在 macOS 上隨手對(duì)一個(gè)文件執(zhí)行l(wèi)s -l輸出長(zhǎng)這樣-rw-r--r-- 1 wzk staff 5 Oct 25 06:09 note.txt。權(quán)限位那一段末尾多了一個(gè)。同一份文件傳到一臺(tái) Linux 機(jī)器上再ls -l不見(jiàn)了剩下的是-rw-r--r-- 1 ...。文件沒(méi)壞字節(jié)數(shù)一樣校驗(yàn)值也一樣。變的只有那個(gè)字符。第一次看見(jiàn)它的人常有兩種猜法都不對(duì)以為它是權(quán)限的一部分以為它表示文件被鎖。它確實(shí)跟權(quán)限位并排顯示但不屬于權(quán)限位——那一段已有專文講過(guò)這里只處理跟在它后面的這個(gè)字符。的含義很窄就一句這個(gè)文件上還掛著擴(kuò)展屬性。它不告訴你掛了幾條、叫什么、值是什么。想知道得換命令。1.2stat給得出的和它給不出的stat能吐出大小、塊數(shù)、inode 號(hào)、鏈接數(shù)、三個(gè)時(shí)間、屬主屬組、權(quán)限位。這是文件系統(tǒng)為每個(gè)文件維護(hù)的那一組POSIX 意義上的stat結(jié)構(gòu)。擴(kuò)展屬性不在這一組里。macOS 的man xattr把兩者的關(guān)系寫(xiě)得很干脆Extended attributes are arbitrary metadata stored with a file, but separate from the filesystem attributes (such as modification time or file size).這句話里有兩個(gè)詞要分開(kāi)讀。stored with a file它是跟文件綁在一起的文件在它就在不是外面另建的一張表。separate from the filesystem attributes它不屬于stat報(bào)的那一組所以你用ls -l、stat、du都看不見(jiàn)它。同一段手冊(cè)還交代了值的形態(tài)通常是以空字符結(jié)尾的 UTF-8 字符串也可以是任意二進(jìn)制。后半句后面會(huì)反復(fù)用到——打印出來(lái)是空白不代表它是空的可能是一段不可打印的字節(jié)長(zhǎng)度還在。1.3 一個(gè)文件其實(shí)有三層信息把這幾件事攤開(kāi)一個(gè)文件身上能讀到的信息至少分三層層記錄在哪用什么看換平臺(tái)還認(rèn)不認(rèn)內(nèi)容層文件的數(shù)據(jù)塊cat、讀文件、算校驗(yàn)值認(rèn)字節(jié)就是字節(jié)文件系統(tǒng)屬性層inode 與目錄項(xiàng)ls -l、stat大體認(rèn)字段名和精度有差異擴(kuò)展屬性層文件系統(tǒng)單獨(dú)為它留的那塊地方macOSxattr、Linuxgetfattr、Windowsdir /r概念在名字和規(guī)則全不一樣第三列最容易被記混前兩層看哪條命令基本是常識(shí)第三層不是。也正因?yàn)樗粎⑴cls -l的默認(rèn)輸出在一次普通的復(fù)制里被丟掉時(shí)沒(méi)有任何提示。本章可以帶走的一句ls -l末尾那個(gè)只說(shuō)明「有」不說(shuō)明「有什么」擴(kuò)展屬性跟stat報(bào)的那一組是兩套記錄不是一套的補(bǔ)充字段。二、macOSxattr的五個(gè)動(dòng)作和一次本機(jī)實(shí)測(cè)2.1 名字長(zhǎng)什么樣macOS 上這一層的命令行入口是xattr。屬性的名字是一串用點(diǎn)分隔的 ASCII 字符實(shí)測(cè)里見(jiàn)到的兩個(gè)是com.apple.provenance和com.example.demo都是反向域名的寫(xiě)法。這個(gè)寫(xiě)法是習(xí)慣本文只描述實(shí)測(cè)到的名字不推斷命名約束——沒(méi)核到能下定論的程度就不寫(xiě)。值是另一回事。默認(rèn)按 UTF-8 打印遇到不可打印的字節(jié)就打不出來(lái)屏幕上表現(xiàn)為冒號(hào)后面空空一片。這不是「屬性沒(méi)有值」是「值不是文本」。要確認(rèn)用十六進(jìn)制看或者看長(zhǎng)度。2.2 五個(gè)動(dòng)作三個(gè)修飾man xattr給的是一組選項(xiàng)。按用途歸一下真正算「動(dòng)作」的是五個(gè)動(dòng)作選項(xiàng)輸出什么列名字不帶選項(xiàng)一行一個(gè)屬性名不給值列名字和值-l名字加冒號(hào)加值不可打印處留空看單個(gè)值-p加屬性名只給那一條的值寫(xiě)-w加名字和值不輸出成功即返回刪一條-d加屬性名不輸出清全部-c不輸出一條不剩嚴(yán)格說(shuō)表里是六行-l是「列」的變體所以習(xí)慣上說(shuō)五個(gè)動(dòng)作。另有三個(gè)修飾選項(xiàng)作用在動(dòng)作上而不是自成動(dòng)作-x把值按十六進(jìn)制顯示用來(lái)對(duì)付上面那種打不出來(lái)的值-r遞歸到目錄里的每一項(xiàng)-s讓命令作用于符號(hào)鏈接本身而不是它指向的目標(biāo)。最后這個(gè)容易被忽略——默認(rèn)情況下你對(duì)一個(gè)軟鏈接執(zhí)行xattr動(dòng)的是鏈接指向的那個(gè)文件。-d和-c的區(qū)別就一句一個(gè)是點(diǎn)名刪一個(gè)是全刪。后者會(huì)把這個(gè)文件上的屬性清空包括系統(tǒng)自己寫(xiě)的那條。2.3 本機(jī)實(shí)測(cè)兩行屬性一行不是我寫(xiě)的下面這段是 2026-10-25 在 macOS 上真跑的命令和輸出都原樣貼。printftest\n/tmp/_xa.txt xattr-wcom.example.demohello/tmp/_xa.txt xattr-l/tmp/_xa.txt輸出是兩行不是我寫(xiě)進(jìn)去的一條com.apple.provenance: com.example.demo: hello第一行是系統(tǒng)自己加的我只寫(xiě)了一條。第二行是我寫(xiě)的那條值就是hello打印得出來(lái)。第一行的冒號(hào)后面是空的——按 2.1 說(shuō)的它的值不是可打印文本。再換ls -l的擴(kuò)展選項(xiàng)看一次ls-l /tmp/_xa.txt xattr /tmp/_xa.txt-rw-r--r-- 1 wzk wheel 5 Oct 25 06:09 /tmp/_xa.txt com.apple.provenance 11 com.example.demo 5 com.apple.provenance com.example.demo這里能讀出兩件事。第一的位置在權(quán)限位之后、鏈接數(shù)之前它是個(gè)標(biāo)記位不是權(quán)限字符。順帶說(shuō)一句邊界-rw-r--r--那九位怎么解讀本文不涉及那是另一篇文章的事這里只看。第二ls -l在下面列出兩行格式是名字加制表符加長(zhǎng)度。com.example.demo是 5跟我寫(xiě)進(jìn)去的hello對(duì)得上com.apple.provenance是 11說(shuō)明它確實(shí)有值只是打印不出來(lái)。xattr不帶選項(xiàng)則只列名字兩行干凈——想知道有沒(méi)有用它最快。一個(gè)能帶走的觀察新建一個(gè)普通文件你一條屬性都不寫(xiě)它上面也已經(jīng)有一條了——系統(tǒng)會(huì)寫(xiě)自己的東西這部分不在你的控制范圍內(nèi)。所以「有擴(kuò)展屬性」這件事本身說(shuō)明不了任何問(wèn)題得看是哪一條。本章可以帶走的一句只提示存在xattr列名字-l給值長(zhǎng)度比內(nèi)容更可靠——值打不出來(lái)不等于沒(méi)有值。三、Linux名字必須帶前綴ACL 就住在這一層3.1 定義幾乎一樣規(guī)則完全不同Linux 側(cè)的手冊(cè)xattr(7)開(kāi)頭是這么寫(xiě)的Extended attributes are name:value pairs associated permanently with files and directories, similar to the environment strings associated with a process.跟 macOS 那句對(duì)照著看前半段講的是同一件事名字值對(duì)跟文件長(zhǎng)期綁定。后半段那個(gè)比喻值得停一下——像進(jìn)程的環(huán)境變量。像的是形態(tài)不像的是生命周期進(jìn)程退出環(huán)境變量就沒(méi)了文件還在屬性就還在。這句permanently是理解后面所有限制的前提。真正的差異在名字上。Linux 要求名字寫(xiě)成全限定形式namespace.attribute前面的命名空間不是裝飾它決定了這條屬性能不能被看見(jiàn)、被誰(shuí)寫(xiě)。3.2 四個(gè)命名空間命名空間誰(shuí)在用誰(shuí)能看見(jiàn)典型名字security內(nèi)核安全模塊如 SELinux、文件能力由那套機(jī)制自己決定本文不推斷security.selinuxsystem內(nèi)核自己用如 ACL跟內(nèi)核功能綁定system.posix_acl_accesstrusted給特權(quán)程序留的只有具備CAP_SYS_ADMIN的進(jìn)程可見(jiàn)trusted.md5sumuser普通屬性用戶自己寫(xiě)普通用戶user.mime_type最該記住的是第三列。trusted那一行是個(gè)硬邊界沒(méi)有那個(gè)能力你連它存在都看不到。這不是權(quán)限位那種「看得見(jiàn)但改不了」是列表里壓根不出現(xiàn)。所以在某臺(tái)機(jī)器上看不到一條屬性不能推出「這臺(tái)機(jī)器上沒(méi)有它」——先確認(rèn)自己是拿什么能力集看的。user那一行也有邊界這類屬性只能加在普通文件和目錄上對(duì)某些目錄另有額外限制。后半句在xattr(7)里是單獨(dú)一段本文不展開(kāi)。3.3 兩個(gè)上限、整體替換和住在這里的 ACL上限有兩個(gè)都是 VFS 層的跟具體文件系統(tǒng)無(wú)關(guān)屬性名最長(zhǎng) 255 字節(jié)屬性值最長(zhǎng) 64 kB。還有第三個(gè)列出名字的那個(gè)調(diào)用返回的名字列表總共也限 64 kB。三個(gè)數(shù)字的實(shí)際含義是擴(kuò)展屬性不是給你存大塊數(shù)據(jù)的地方。64 kB 要裝下所有屬性值名字列表那份還要裝下所有名字屬性一多列名字這個(gè)動(dòng)作本身就會(huì)撞上限。讀寫(xiě)語(yǔ)義是另一條getxattr(2)一次取回整個(gè)值setxattr(2)整體替換舊值。沒(méi)有「改中間一個(gè)字節(jié)」的接口要改一個(gè)字符也得把整個(gè)值寫(xiě)回去。這條語(yǔ)義推下去有兩個(gè)后果。一是并發(fā)寫(xiě)不安全兩個(gè)進(jìn)程同時(shí)setxattr同一條落盤(pán)的是后完成的那次修改不會(huì)合并。二是它適合「標(biāo)記」不適合「狀態(tài)」。ACL 也是這一層里的一條值得單獨(dú)說(shuō)。很多人把 ACL 當(dāng)成跟擴(kuò)展屬性并列的另一套東西xattr(7)里有一句把這個(gè)誤會(huì)直接打消additional security features such as Access Control Lists (ACLs) may be implemented using extended attributes也就是說(shuō)ACL 是用擴(kuò)展屬性實(shí)現(xiàn)的。落到名字上就是system.posix_acl_access這一條。價(jià)值在操作層面「清空擴(kuò)展屬性」和「清掉 ACL」在某些命令下是同一個(gè)動(dòng)作。你把一個(gè)目錄上的屬性全刪掉順手也刪了訪問(wèn)控制列表屏幕上一句提示都沒(méi)有。所以清理前先列一遍名字看清有哪些條、屬于哪個(gè)命名空間。所以我建議用-d逐條刪而不是-c一把清干凈前者你至少知道自己刪了什么。??代碼待驗(yàn)證Linux 側(cè)命令按xattr(7)與 attr 工具手冊(cè)寫(xiě)本機(jī)是 macOS未在 Linux 上執(zhí)行g(shù)etfattr-d-m- /tmp/example.txt setfattr-nuser.mime_type-vtext/plain/tmp/example.txt getfattr-nuser.mime_type --only-values /tmp/example.txt第一條把文件上所有可讀的屬性連名字帶值列出來(lái)第二條寫(xiě)一條user.*第三條只取值。跑之前先確認(rèn)這臺(tái)機(jī)器上裝了 attr 這套工具——不是所有發(fā)行版都預(yù)裝這一點(diǎn)本文不給具體包名。本章可以帶走的一句Linux 的擴(kuò)展屬性名字必須帶命名空間命名空間決定可見(jiàn)性ACL 就住在system.*里所以「清屬性」和「清 ACL」可能是同一次操作。四、Windows一個(gè)文件至少有一個(gè)流4.1 默認(rèn)數(shù)據(jù)流與那個(gè)雙冒號(hào)Windows 那邊的對(duì)應(yīng)機(jī)制不叫擴(kuò)展屬性叫流。[MS-FSCC] 對(duì) NTFS 的描述第一句就把范圍說(shuō)清了All files on an NTFS volume consist of at least one stream - the main stream – this is the normal, viewable file in which data is stored.注意at least one一個(gè)文件不是「一塊數(shù)據(jù)加若干附加信息」而是「一個(gè)或多個(gè)流」其中必有一個(gè)是主數(shù)據(jù)流——你在資源管理器里雙擊打開(kāi)的那個(gè)。完整的名字是三段式filename:stream name:stream type。主數(shù)據(jù)流沒(méi)有名字所以一個(gè)sample.txt的主數(shù)據(jù)流全名寫(xiě)出來(lái)是sample.txt::$DATA——中間那段是空的雙冒號(hào)就是這么來(lái)的。寫(xiě)法指的是什么默認(rèn)看得見(jiàn)嗎sample.txt主數(shù)據(jù)流等價(jià)于sample.txt::$DATA看得見(jiàn)就是那個(gè)文件sample.txt:note:$DATA一條備用數(shù)據(jù)流類型是$DATA不顯示目錄的$I30段類型$INDEX_ALLOCATION目錄自己也有流不顯示第三行容易被漏掉目錄也有流。目錄項(xiàng)的索引本身就以$INDEX_ALLOCATION類型的一條流存在默認(rèn)流名是$I30。所以「流」不是文件專有的機(jī)制它是這個(gè)文件系統(tǒng)描述一切東西的方式。4.2 怎么看見(jiàn)/R這個(gè)開(kāi)關(guān)[MS-FSCC] 里寫(xiě)得很直接These alternate data streams are not normally visible, but can be observed from a command line using the /R option of the DIR command.這句話里兩個(gè)詞要分開(kāi)看not normally visible說(shuō)的是資源管理器can be observed說(shuō)的是命令行加一個(gè)開(kāi)關(guān)。??代碼待驗(yàn)證Windows 側(cè)命令按 [MS-FSCC] 寫(xiě)未在本機(jī)執(zhí)行rem 在 cmd.exe 里對(duì)一個(gè)目錄執(zhí)行 dir /r輸出里會(huì)在文件名之外多出以冒號(hào)分隔的那一段具體排版隨版本不同本文不貼樣例也不猜格式。邊界劃在這里本文只講它存在、怎么看見(jiàn)不講怎么用它放東西??匆?jiàn)和利用是兩件事很多講這一層的文章就是在這一句上滑過(guò)去的。4.3 三平臺(tái)并排看把前面三章壓成一張表平臺(tái)這一層叫什么怎么列出來(lái)誰(shuí)能看見(jiàn)macOS擴(kuò)展屬性extended attributesxattr列名字xattr -l連值ls -l看與長(zhǎng)度屬主可讀寫(xiě)2.3 實(shí)測(cè)系統(tǒng)另寫(xiě)一批Linux擴(kuò)展屬性名字必須是namespace.attributegetfattr或直接調(diào)listxattr取決于命名空間trusted需CAP_SYS_ADMINWindows NTFS流stream主數(shù)據(jù)流加備用數(shù)據(jù)流dir /r或按文件名:流名:$DATA拼完整名主數(shù)據(jù)流就是文件本身備用流默認(rèn)不顯示表里沒(méi)有明說(shuō)、但最該記住的一點(diǎn)只有 macOS 會(huì)在ls -l里留一個(gè)字符提示你有東西。Linux 和 Windows 什么都不提示。所以「看不見(jiàn)」在三個(gè)平臺(tái)上一個(gè)意思不等于沒(méi)有只等于「你用的這條命令不看這一層」。本章可以帶走的一句NTFS 里文件是流的集合主數(shù)據(jù)流沒(méi)名字、全名帶::$DATA三個(gè)平臺(tái)都不會(huì)在默認(rèn)輸出里提醒你這一層存在。五、搬家的時(shí)候這一層跟不跟著走5.1 結(jié)論只有一句默認(rèn)不搬這一段最容易被說(shuō)過(guò)頭。能確定的只有這一層打包、復(fù)制這類動(dòng)作默認(rèn)不會(huì)把擴(kuò)展屬性帶過(guò)去要帶就得顯式打開(kāi)某個(gè)開(kāi)關(guān)。至于每個(gè)工具默認(rèn)開(kāi)不開(kāi)、開(kāi)關(guān)叫什么、開(kāi)了之后跨文件系統(tǒng)還成不成立各工具不一樣本文不下結(jié)論也不給參數(shù)寫(xiě)法。原因可以從定義推出來(lái)不需要查任何一個(gè)工具這一層是stored with a file但separate from the filesystem attributes2.1 引的那句。一個(gè)「復(fù)制文件」的動(dòng)作常規(guī)做法是讀數(shù)據(jù)、寫(xiě)數(shù)據(jù)、再按需要補(bǔ)幾個(gè)stat字段。屬性那一層不在數(shù)據(jù)里也不在stat那一組里所以它天然落在復(fù)制的默認(rèn)路徑之外。5.2 四種搬家場(chǎng)景要確認(rèn)的東西不一樣場(chǎng)景這一層跟不跟著走需要確認(rèn)什么同一塊盤(pán)上改名或移動(dòng)位置變了沒(méi)有寫(xiě)出新文件仍建議前后各列一次別假設(shè)跨盤(pán)、跨文件系統(tǒng)復(fù)制新文件被寫(xiě)出來(lái)屬性不自動(dòng)跟工具是否提供開(kāi)關(guān)開(kāi)關(guān)在手冊(cè)哪一節(jié)打包再解開(kāi)中間產(chǎn)物是歸檔屬性要單獨(dú)帶打包與解包兩端都得支持缺一端就丟跨操作系統(tǒng)傳遞目標(biāo)平臺(tái)未必有同名概念名字空間規(guī)則不同開(kāi)關(guān)打開(kāi)也可能無(wú)處落腳最后一行最麻煩。macOS 是扁平的點(diǎn)分名字Linux 要求namespace.attribute全限定NTFS 那邊是流、名字里帶冒號(hào)。三種模型之間沒(méi)有共同的表示所以跨平臺(tái)搬這一層問(wèn)題不在「能不能復(fù)制」在「目標(biāo)那邊有沒(méi)有這個(gè)概念可以接收」。?? 這一段按待驗(yàn)證處理各工具的具體默認(rèn)值本文不給只保留「默認(rèn)不搬、需要顯式開(kāi)關(guān)」這一層。要寫(xiě)進(jìn)自己的操作手冊(cè)得拿目標(biāo)版本的工具親手試一遍。5.3 為什么它丟得悄無(wú)聲息因?yàn)樗鼇G的時(shí)候所有你能想到的檢查都是通過(guò)的。文件大小一樣——屬性不在文件大小里。修改時(shí)間一樣——那是stat那一組跟這一層不相干。校驗(yàn)值一樣——屬性不在數(shù)據(jù)塊里校驗(yàn)算的是內(nèi)容。打開(kāi)也正?!x內(nèi)容的程序根本不看這一層。唯一的檢查方式是列屬性不是比內(nèi)容。搬完之后用目標(biāo)平臺(tái)那條命令列一次名字跟搬之前那份對(duì)一遍名字少了就是少了名字在而值變了得單獨(dú)看。??代碼待驗(yàn)證流程示意本機(jī)未對(duì)真實(shí)跨機(jī)復(fù)制執(zhí)行printf%s\n第 1 步源端列一次屬性名字存成清單printf%s\n第 2 步執(zhí)行復(fù)制記錄用了哪些開(kāi)關(guān)printf%s\n第 3 步目標(biāo)端再列一次屬性名字存成清單printf%s\n第 4 步兩份清單對(duì)比只比名字先不比值printf%s\n第 5 步名字缺失的回到第 2 步看開(kāi)關(guān)不要先懷疑文件損壞第 5 步是我最想強(qiáng)調(diào)的屬性缺失和文件損壞是兩件不同的事表現(xiàn)卻很像。先懷疑開(kāi)關(guān)比先懷疑磁盤(pán)劃算。完整版對(duì)照資料這一章對(duì)照的三平臺(tái)「怎么列屬性、搬家前后怎么比對(duì)」的操作卡我整理成了一頁(yè)跟靶場(chǎng)環(huán)境對(duì)照表放在同一個(gè)資料包里掃碼即可獲取本章可以帶走的一句復(fù)制工具復(fù)制的是文件不是文件在原來(lái)那臺(tái)機(jī)器上的全部狀態(tài)屬性丟沒(méi)丟只能靠搬家前后各列一次名字來(lái)判。六、安全上為什么在意6.1 有些判定讀的是這一層不是內(nèi)容把前面幾章散落的點(diǎn)收一下會(huì)發(fā)現(xiàn)這一層里裝的并不都是「?jìng)渥ⅰ乖L問(wèn)控制列表在system.posix_acl_access3.3 那句原文。SELinux 的標(biāo)簽在security.selinux3.2 的表。文件能力也掛在security命名空間下同一處。Windows 上「文件來(lái)源」這類信息是按流記錄的[MS-FSCC] 的流模型具體流名本文不展開(kāi)。這些信息的共同點(diǎn)是做訪問(wèn)判斷時(shí)系統(tǒng)讀的是它們不是內(nèi)容。判斷發(fā)生在你讀到文件之前——能不能訪問(wèn)、以什么身份執(zhí)行、這個(gè)文件從哪來(lái)。第五章的結(jié)論到這里就變得更要緊了屬性默認(rèn)不跟著走意味著這些判定在新機(jī)器上讀到的是「沒(méi)有」。而「沒(méi)有標(biāo)簽」和「標(biāo)簽是對(duì)的」是兩種狀態(tài)前者通常落到那套機(jī)制的默認(rèn)處理上后者才是你在原來(lái)那臺(tái)機(jī)器上驗(yàn)證過(guò)的。默認(rèn)處理具體是什么取決于那套機(jī)制自己的策略本文不給結(jié)論——不同策略答案不一樣寫(xiě)個(gè)通用答案就是在編。6.2 兩個(gè)方向丟了和被帶過(guò)來(lái)方向一該在的不在了。一臺(tái)機(jī)器上配好的訪問(wèn)控制、安全標(biāo)簽經(jīng)過(guò)一次打包和一次解包落到新機(jī)器上。文件能用但那些判定讀到的是空的。這種降級(jí)不報(bào)錯(cuò)也不會(huì)有人察覺(jué)——除非有人專門(mén)去列一次屬性。方向二不該在的來(lái)了。反過(guò)來(lái)一個(gè)從別處來(lái)的文件屬性如果被完整帶過(guò)來(lái)了記錄的就是它原來(lái)那臺(tái)機(jī)器上的狀態(tài)。1.3 那張表里我把它叫第三層現(xiàn)在可以補(bǔ)一句這一層記錄的是過(guò)程不是內(nèi)容。最典型的是系統(tǒng)自己寫(xiě)的那條。2.3 里新建一個(gè)空文件com.apple.provenance就已經(jīng)在了我什么都沒(méi)做。它的名字指向「來(lái)源」但具體含義本文不推斷——沒(méi)人為它給出語(yǔ)義我也不替它編。能確定的只有兩點(diǎn)它由系統(tǒng)寫(xiě)入它的值不是給人讀的文本。這就夠支撐一條建議看到com.apple.*開(kāi)頭的屬性先假設(shè)它不該被你手動(dòng)刪。6.3 名字本身就是線索判斷一條屬性該不該動(dòng)第一眼看的不是值是名字。前綴基本就交代了它是誰(shuí)寫(xiě)的com.apple.*系統(tǒng)寫(xiě)的2.3 實(shí)測(cè)。刪了文件內(nèi)容不變但那條記錄就沒(méi)了。system.*內(nèi)核用ACL 就在這一類里。刪它等于改訪問(wèn)控制不是清理垃圾。security.*內(nèi)核安全模塊用。刪了可能讓判定落到默認(rèn)策略上后果由那套策略決定。trusted.*特權(quán)側(cè)普通身份連看都看不到別把它算進(jìn)「沒(méi)有」。user.*普通用戶這一類才是可以隨手清的。只有最后一行讓人放心。前四行都屬于「不是你的東西」其中system.*和security.*尤其——看上去像備注實(shí)際是判定輸入。這也回到了 2.2 提到的那個(gè)差別-d點(diǎn)名刪-c全刪。如果你連這些名字是誰(shuí)寫(xiě)的都還沒(méi)分清就不該用全刪。本章可以帶走的一句安全判定讀的是這一層而「屬性不在」不等于「屬性和原來(lái)一樣」動(dòng)它之前先看名字前綴com.apple.*、system.*、security.*都不是清理對(duì)象。七、三分平臺(tái)自查清單7.1 macOS三條命令按順序來(lái)ls -l看末尾有沒(méi)有。有才值得往下走。xattr 文件名列名字。這一步回答「有幾條、叫什么」。xattr -l 文件名連值一起看。值打不出來(lái)的回ls -l看長(zhǎng)度或加-x看十六進(jìn)制。順序不能反先看值容易陷進(jìn)「這一串是什么」而多數(shù)時(shí)候你只需要知道有幾條。三個(gè)判讀要點(diǎn)只表示存在冒號(hào)后空白不代表沒(méi)有值-s不寫(xiě)動(dòng)的是鏈接指向的目標(biāo)而不是鏈接本身。7.2 Linux 與 Windows各一條Linux 側(cè)用getfattr -d -m - 文件名把可讀的都列出來(lái)重點(diǎn)看名字前綴落在哪個(gè)命名空間??床坏侥硹l先確認(rèn)自己的能力集——trusted.*在沒(méi)有CAP_SYS_ADMIN時(shí)列表里就是不出現(xiàn)。Windows 側(cè)在 cmd 里dir /r看文件名后面有沒(méi)有多出一段以冒號(hào)分隔的名字。有就是備用數(shù)據(jù)流沒(méi)有也不代表這個(gè)文件「干凈」只代表這一層沒(méi)有額外的流。兩邊共同的注意點(diǎn)這兩個(gè)命令的輸出格式在不同版本上不完全一樣別把某一次的排版當(dāng)成標(biāo)準(zhǔn)答案。7.3 三條判讀紀(jì)律第一看不見(jiàn)不等于沒(méi)有。三個(gè)平臺(tái)默認(rèn)都不提醒你這一層。macOS 好歹留了個(gè)Linux 和 Windows 連這個(gè)都沒(méi)有。第二讀不出來(lái)不等于空的。屬性值可以是任意二進(jìn)制打印成空白是正常現(xiàn)象長(zhǎng)度才是它存在的證據(jù)。第三復(fù)制完內(nèi)容一致不等于這一層一致。大小、時(shí)間、校驗(yàn)值全對(duì)屬性可能一條沒(méi)跟過(guò)來(lái)。要確認(rèn)只能列名單對(duì)比。這三條其實(shí)是一句話的三個(gè)面這一層的存在感和它的重要性成反比。越是不顯示的東西越容易在搬家時(shí)被丟掉而丟掉之后又越難發(fā)現(xiàn)。本章可以帶走的一句先確認(rèn)有沒(méi)有看標(biāo)記、列名字再確認(rèn)是什么看值、看長(zhǎng)度最后才談搬不搬得走——順序?qū)α诉@一層就不神秘。完整版對(duì)照資料第七章這份三平臺(tái)自查清單macOS 三條、Linux 與 Windows 各一條、三條判讀紀(jì)律和第五章的搬家對(duì)照是同一套材料的兩面我都收在資料包里了掃碼即可獲取附表 A本文引用事實(shí)與官方出處對(duì)照表序號(hào)事實(shí)出處核驗(yàn)日期本文位置1擴(kuò)展屬性是隨文件存儲(chǔ)、但與文件系統(tǒng)屬性修改時(shí)間、文件大小等分離的任意元數(shù)據(jù)macOSman xattrXA-022026-10-25第一章 1.22屬性值通常是以空字符結(jié)尾的 UTF-8 字符串也可以是任意二進(jìn)制macOSman xattrXA-022026-10-25第一章 1.2、第七章 7.33本機(jī)實(shí)測(cè)用xattr -w把 hello 寫(xiě)進(jìn)com.example.demo后xattr -l輸出com.apple.provenance:與com.example.demo: hello兩行本機(jī)命令輸出XA-012026-10-25第二章 2.34本機(jī)實(shí)測(cè)新建文件會(huì)自動(dòng)帶com.apple.provenance由系統(tǒng)寫(xiě)入本機(jī)命令輸出XA-012026-10-25第二章 2.3、第六章 6.25本機(jī)實(shí)測(cè)ls -l在權(quán)限位后顯示下方按名字與值長(zhǎng)度列出兩條11 與 5本機(jī)命令輸出XA-012026-10-25第二章 2.36各動(dòng)作對(duì)應(yīng)的選項(xiàng)不帶選項(xiàng)列名字、-l連名字帶值、-p打印單值、-w寫(xiě)、-d刪單條、-c清全部macOSman xattrXA-032026-10-25第二章 2.2、第六章 6.37三個(gè)修飾-x十六進(jìn)制、-r遞歸、-s作用于符號(hào)鏈接本身macOSman xattrXA-032026-10-25第二章 2.2、第七章 7.18「Extended attributes are name:value pairs associated permanently with files and directories, similar to the environment strings associated with a process.」xattr(7)XA-042026-10-25第三章 3.19四個(gè)命名空間security、system、trusted、user的用途名字一律寫(xiě)成namespace.attributexattr(7)XA-052026-10-25第三章 3.210trusted命名空間只有具備CAP_SYS_ADMIN的進(jìn)程可見(jiàn)xattr(7)XA-052026-10-25第三章 3.2、第七章 7.211user.*只允許加在普通文件和目錄上對(duì)某些目錄另有額外限制xattr(7)XA-062026-10-25第三章 3.212屬性名最長(zhǎng) 255 字節(jié)、屬性值最長(zhǎng) 64 kB、名字列表也限 64 kBxattr(7)XA-072026-10-25第三章 3.313「additional security features such as Access Control Lists (ACLs) may be implemented using extended attributes」xattr(7)XA-082026-10-25第三章 3.3、第六章 6.114getxattr(2)一次取回整個(gè)值setxattr(2)整體替換舊值xattr(7)XA-092026-10-25第三章 3.315「All files on an NTFS volume consist of at least one stream - the main stream…」[MS-FSCC] 5.1XA-102026-10-25第四章 4.116流全名形如filename:stream name:stream type主數(shù)據(jù)流無(wú)名字sample.txt的默認(rèn)流全名是sample.txt::$DATA[MS-FSCC] 5.1XA-102026-10-25第四章 4.117「These alternate data streams are not normally visible, but can be observed from a command line using the /R option of the DIR command.」[MS-FSCC] 5.1XA-112026-10-25第四章 4.218目錄也有流類型$INDEX_ALLOCATION默認(rèn)流名$I30[MS-FSCC] 5.1XA-112026-10-25第四章 4.119Windows 上「文件來(lái)源」這類信息按備用數(shù)據(jù)流記錄本文不展開(kāi)流名與取值[MS-FSCC]XA-122026-10-25第六章 6.120待驗(yàn)證打包與復(fù)制工具是否搬運(yùn)擴(kuò)展屬性各工具默認(rèn)值不同本文只寫(xiě)「默認(rèn)不搬、需要顯式開(kāi)關(guān)」不給參數(shù)寫(xiě)法本批事實(shí)文件XA-132026-10-25第五章 5.1、5.221本文范圍只用 ADS 說(shuō)明「它存在、怎么看見(jiàn)」不寫(xiě)任何用它放置數(shù)據(jù)的手法本批紀(jì)律XA-142026-10-25第四章 4.222本文范圍不涉及權(quán)限位的rwx、特殊位與目錄的那套規(guī)則僅在 2.3 作一句邊界說(shuō)明本批紀(jì)律XA-152026-10-25第二章 2.3附表 B術(shù)語(yǔ)速查表術(shù)語(yǔ)一句話解釋擴(kuò)展屬性跟文件綁在一起、但不在stat那一組里的名字值對(duì)值可以是文本也可以是二進(jìn)制標(biāo)記macOSls -l在權(quán)限位后面加的提示只表示「有擴(kuò)展屬性」不表示內(nèi)容xattrmacOS 上操作這一層的命令行入口列名字、看值、寫(xiě)、刪、清都靠它的選項(xiàng)命名空間Linux 名字的前綴user/system/trusted/security決定可見(jiàn)性與用途CAP_SYS_ADMINLinux 的一個(gè)特權(quán)能力沒(méi)有它trusted.*屬性在列表里根本不出現(xiàn)ACL訪問(wèn)控制列表在 Linux 上就是用擴(kuò)展屬性實(shí)現(xiàn)的system.posix_acl_access主數(shù)據(jù)流NTFS 里那個(gè)「沒(méi)有名字」的流就是你在資源管理器里看到的文件本身全名以::$DATA收尾備用數(shù)據(jù)流NTFS 里主數(shù)據(jù)流之外的那些流默認(rèn)不顯示跨平臺(tái)復(fù)制時(shí)也沒(méi)有對(duì)應(yīng)物$I30目錄自身那條流的默認(rèn)名字類型是$INDEX_ALLOCATION整體替換setxattr的語(yǔ)義一次寫(xiě)完整個(gè)值沒(méi)有「改一半」的接口寫(xiě)在最后這篇用到的資料寫(xiě)這篇文章時(shí)我把三個(gè)平臺(tái)的這一層并排攤在一張紙上最費(fèi)勁的是接受「它們壓根不是同一個(gè)東西」——只在三個(gè)平臺(tái)上都靠ls -l那點(diǎn)信息就永遠(yuǎn)對(duì)不上順手也整理了幾份配套的東西靶場(chǎng)環(huán)境對(duì)照表DVWA、upload-labs 在 Windows / macOS / Linux 三平臺(tái)的可行性與推薦路徑Web 安全學(xué)習(xí)路線圖從基礎(chǔ)打牢到安全管理四個(gè)階段各學(xué)什么常用靶場(chǎng)清單每個(gè)靶場(chǎng)練什么、適合哪個(gè)階段資料是我自己整理的放在下面這個(gè)碼上掃碼即可獲取添加時(shí)備注「靶場(chǎng)」優(yōu)先通過(guò)。拿到之后建議先看環(huán)境對(duì)照表那一份先把手上這臺(tái)機(jī)器的「看不見(jiàn)的那一層」列一遍再談環(huán)境怎么搭。