0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

公共 GitHub repo的 secret 泄漏有多嚴重

谷歌開發(fā)者 ? 來源:谷歌開發(fā)者 ? 作者:谷歌開發(fā)者 ? 2021-12-29 15:57 ? 次閱讀

作者 / Michael Thomsen, Dart & Flutter Product Manager, Google

我們已經正式發(fā)布了 Dart SDK 的 2.15 版本,該版本新增了可快速并發(fā)的工作器 isolate、新的構造函數(shù)拆分 (tear-off) 語言特性、經過改進的 dart:core 庫枚舉支持、package 發(fā)布者相關的新功能,等等。

工作器 isolate 的快速并發(fā)

如今,幾乎所有現(xiàn)代設備都使用多核 CPU,可以并行執(zhí)行多個任務。對于大多數(shù) Dart 程序來說,這些內核的使用情況對開發(fā)者而言是透明的: 默認情況下,Dart 運行時系統(tǒng)在單個內核上運行所有的 Dart 代碼,不過會使用其他內核來執(zhí)行系統(tǒng)級任務,比如異步輸入/輸出,包括寫入文件或者調用網絡等。

不過您自己的 Dart 代碼可能也需要并發(fā)運行。例如,您可能需要展示一個連續(xù)的動畫,同時執(zhí)行一個長時間運行的任務,比如解析一個大型 JSON 文件。如果額外任務花了太長時間,就可能會導致界面卡頓或延遲。如果將這些額外的任務移動到另一個單獨的內核,動畫就可以在主執(zhí)行線程上繼續(xù)運行而不受干擾。

Dart 的并發(fā)模型基于 isolate,isolate 是一種相互隔離的獨立執(zhí)行單元,這是為了避免出現(xiàn)與共享內存相關的大量并發(fā)編程錯誤,如數(shù)據(jù)爭用等競態(tài)條件。Dart 通過禁止在 isolate 之間共享任何可變對象來避免這些錯誤,并使用消息傳遞在 isolate 之間交換狀態(tài)。在 Dart 2.15 中,我們對 isolate 進行了許多實質性的改進。

Dart 中的并發(fā) https://dart.dev/guides/language/concurrency

競態(tài)條件 https://en.wikipedia.org/wiki/Race_condition#In_software

在 isolate 間發(fā)送多條消息 https://dart.dev/guides/language/concurrency#sending-multiple-messages-between-isolates

我們首先重新設計和實現(xiàn)了 isolate 的工作方式,引入了一個新概念: isolate 組。Isolate 組中的 isolate 共享各種內部數(shù)據(jù)結構,這些數(shù)據(jù)結構則表示正在運行的程序。這使得組中的單個 isolate 變得更加輕便。如今,因為不需要初始化程序結構,在現(xiàn)有 isolate 組中啟動額外的 isolate 比之前快 100 多倍,并且產生的 isolate 所消耗的內存減少了 10 至 100 倍。

雖然 isolate 組仍然阻止在 isolate 間共享訪問可變對象,但由于 isolate 組使用共享堆實現(xiàn),這也讓其擁有了更多的功能。我們可以將對象從一個 isolate 傳遞到另一個 isolate,這可用于執(zhí)行返回大量內存數(shù)據(jù)的任務的工作器 isolate。例如,工作器 isolate 通過網絡調用獲得數(shù)據(jù),將該數(shù)據(jù)解析為大型 JSON 對象圖,然后將這個 JSON 圖返回到主 isolate 中。在推出 Dart 2.15 之前,執(zhí)行該操作需要深度復制,如果復制花費的時間超過幀預算時間,就會導致界面卡頓。

在 Dart 2.15 中,工作器 isolate 可以調用 Isolate.exit(),將其結果作為參數(shù)傳遞。然后,Dart 運行時將包含結果的內存數(shù)據(jù)從工作器 isolate 傳遞到主 isolate 中,無需復制,且主 isolate 可以在固定時間內接收結果。我們已經在 Flutter 2.8 中更新了 compute() 實用函數(shù),來利用 Isolate.exit()。如果您已經在使用 compute(),那么在升級到 Flutter 2.8 后,您將自動獲得這些性能提升。

Isolate.exit() https://api.dart.cn/stable/2.15.0/dart-isolate/Isolate/exit.html

compute() https://api.flutter-io.cn/flutter/foundation/compute-constant.html

最后,我們還重新設計了 isolate 消息傳遞機制的實現(xiàn)方式,使得中小型消息的傳遞速度提高了大約 8 倍。發(fā)送消息的速度明顯更快,而接收信息幾乎總是在恒定的時間內完成。另外,我們擴展了 isolate 可以相互發(fā)送的對象種類,增加了對函數(shù)類型、閉包和堆棧跟蹤對象的支持。請參閱 SendPort.send() 的 API 文檔了解詳情:

https://api.dart.cn/stable/2.15.0/dart-isolate/SendPort/send.html

要了解有關如何使用 isolate 的更多信息,請參閱我們?yōu)?Dart 2.15 添加的官方文檔 Dart 中的并發(fā),以及更多代碼示例。

Dart 中的并發(fā) https://dart.cn/guides/language/concurrency

代碼示例 https://github.com/dart-lang/samples/tree/master/isolates

新語言特性:構造函數(shù)拆分

在 Dart 中,您可以使用函數(shù)名稱創(chuàng)建一個函數(shù)對象,該對象指向另一個對象的函數(shù)。在以下示例中,main() 方法的第二行演示了將 g 指向 m.greet 的語法:

class Greeter {  final String name;  Greeter(this.name);
  void greet(String who) {    print('$name says: Hello $who!');  }}void main() {  final m = Greeter('Michael');  final g = m.greet; // g holds a function pointer to m.greet.  g('Leaf'); // Invokes and prints "Michael says: Hello Leaf!"}

在使用 Dart 核心庫時,這種函數(shù)指針 (也被稱為函數(shù)拆分) 經常出現(xiàn)。下面是通過傳遞函數(shù)指針在 iterable 上調用 foreach() 的示例:

final m = Greeter('Michael');['Lasse', 'Bob', 'Erik'].forEach(m.greet);// Prints "Michael says: Hello Lasse!", "Michael says: Hello Bob!",// "Michael says: Hello Erik!"

在之前的版本中,Dart SDK 不支持創(chuàng)建構造函數(shù)的拆分 (語言問題 #216)。這就有點煩人,因為在許多情況下,例如構建 Flutter 界面時,就需要用到構造函數(shù)的拆分。從 Dart 2.15 開始,我們支持這種語法。以下是構建包含三個 Text widget 的 Column widget 的示例,通過調用 .map() 將 Text 構造函數(shù)的拆分傳遞給 Column 的子項。

class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) {   return Column(       children: ['Apple', 'Orange'].map(Text.new).toList()); }}

#216: 允許像傳遞方法一樣傳遞構造函數(shù)

https://github.com/dart-lang/language/issues/2

Text.new 指 Text 類的默認構造函數(shù)。您也可以引用命名構造函數(shù),例如 .map(Text.rich)。

相關語言變化

在實現(xiàn)構造函數(shù)拆分時,我們也借此機會修復了現(xiàn)有的函數(shù)指針功能中的一些不一致問題?,F(xiàn)在可以特化泛型方法來創(chuàng)建非泛型方法:

T id(T value) => value;var intId = id; // New in 2.15.int Function(int) intId = id; // Pre-2.15 workaround.

您甚至可以特化一個泛型函數(shù)對象來創(chuàng)建一個非泛型函數(shù)對象:

const fo = id; // Tear off `id`, creating a function object.const c1 = fo; // New in 2.15; error before.

最后,Dart 2.15 清理了涉及泛型的類型字面量:

var y = List; // Already supported.var z = List; // New in 2.15.var z = typeOf>(); // Pre-2.15 workaround.

改進 dart:core 庫中的枚舉

我們?yōu)?dart:core 庫的枚舉 API 添加了許多優(yōu)化 (語言問題 #1511)。現(xiàn)在您可以通過 .name 獲取每個枚舉值的 String 值:

enum MyEnum { one, two, three}void main() { print(MyEnum.one.name);  // Prints "one".}

#1511: 為枚舉值添加 name 實例屬性 https://github.com/dart-lang/language/issues/1511

還可以按名稱查找枚舉值:

print(MyEnum.values.byName('two') == MyEnum.two);  // Prints "true".

最后,您可以獲得所有名稱-值對的映射:

final map = MyEnum.values.asNameMap();print(map['three'] == MyEnum.three);  // Prints "true".

請參閱此 Flutter PR 查看這些新 API 的使用示例:

https://github.com/flutter/flutter/pull/94496/files

壓縮指針

Dart 2.15 增加了對壓縮指針的支持,這樣,如果只需要支持 32 位的地址空間 (最多 4 GB 內存),則 64 位 SDK 可以使用更加節(jié)省空間的指針表示形式。壓縮指針顯著減少了內存占用,在對 Google Pay 應用的內部測試中,我們發(fā)現(xiàn) Dart 堆的體積減少了大約 10%。

壓縮指針意味著無法處理 4 GB 以上的可用 RAM,因此該功能只存在于 Dart SDK 的配置選項中,只能在構建 SDK 時由 Dart SDK 的嵌入器啟用。Flutter SDK 2.8 版已為 Android 構建啟用此配置,F(xiàn)lutter 團隊正在考慮在后續(xù)版本中為 iOS 構建啟用此配置:

https://github.com/flutter/flutter/issues/94753

Dart SDK 中包含 Dart DevTools

以往 Dart SDK 不提供調試和性能工具的 DevTools 套件,您需要單獨下載。從 Dart 2.15 開始,下載 Dart SDK 時也會獲取 DevTools,無需進一步的安裝步驟。有關在 Dart 命令行應用中使用 DevTools 的更多信息,請參閱 DevTools 文檔:

https://dart.dev/tools/dart-devtools#using-devtools-with-a-command-line-app

DevTools套件

https://dart.dev/tools/dart-devtools#

面向 package 發(fā)布者的新 pub 功能

Dart 2.15 SDK 在 dart pub 開發(fā)者命令和 pub.devpackage repo 中還新增了兩個功能。 首先,為 package 發(fā)布者新增了一個安全功能,用于檢測發(fā)布者在 pub package 中意外發(fā)布 secret,例如 Cloud 或 CI 憑據(jù)。在了解到 GitHub repo 中每天都有數(shù)以千計的 secret 被泄露后,我們便決定添加這個泄露檢測功能。

公共 GitHub repo 的 secret 泄漏有多嚴重?

https://www.ndss-symposium.org/wp-content/uploads/2019/02/ndss2019_04B-3_Meli_paper.pdf

泄露檢測作為 dart pub publish 命令中的預發(fā)布驗證的一部分運行。如果它在即將發(fā)布的文件中檢測到潛在的 secret,publish 命令會退出,而不進行發(fā)布,并打印如下輸出:

Publishing my_package 1.0.0 to https://pub.dartlang.org:Package validation found the following errors:* line 1, column 1 of lib/key.pem: Potential leak of Private Key detected.?1 │ ┌ - - -BEGIN PRIVATE KEY - - -2 │ │ H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ3 │ └ - - -END PRIVATE KEY - - -?* line 2, column 23 of lib/my_package.dart: Potential leak of Google OAuth Refresh Token detected.?2 │ final refreshToken = "1//042ys8uoFwZrkCgYIARAAGAQSNwF-L9IrXmFYE-sfKefSpoCnyqEcsHX97Y90KY-p8TPYPPnY2IPgRXdy0QeVw7URuF5u9oUeIF0";

在極少數(shù)情況下,此項檢測可能會出現(xiàn)誤報,將您實際上打算發(fā)布的內容或文件標記為潛在泄露。在這些情況下,您可以將文件添加到許可名單中:

https://dart.cn/tools/pub/pubspec#false_secrets

其次,我們還為發(fā)布者添加了另一個功能:撤銷已發(fā)布的 package 版本。當發(fā)布了有問題的 package 版本時,我們通常的建議是發(fā)布一個小幅升級的新版本來修復意外問題。但在極少數(shù)情況下,例如您尚未修復這些問題,或是您在原打算只發(fā)布一個次要版本時意外發(fā)布了一個主要版本,那么您就可以使用新的 package 撤銷功能,作為最后的補救方法。此功能在 pub.dev 的管理界面中提供:

撤銷 package 版本

https://dart.cn/tools/pub/publishing#retract

在 package 版本被撤銷后,pub 客戶端在 pub get 或 pub upgrade 中將不再解析該版本。如果有開發(fā)者已經解析該撤銷的版本 (并存在于他們的 pubspec.lock 文件中),他們將在下次運行 pub 時看到警告:

$ dart pub getResolving dependencies…mypkg 0.0.181-buggy (retracted, 0.0.182-fixed available)Got dependencies!

檢測雙向 Unicode 字符的安全性分析 (CVE-2021–22567)

最近發(fā)現(xiàn)了一個涉及雙向 Unicode 字符的通用編程語言漏洞 (CVE-2021–42574)。這個漏洞影響了大多數(shù)支持 Unicode 的現(xiàn)代編程語言。下面的 Dart 源代碼演示了這個問題:

main() { final accessLevel = 'user'; if (accessLevel == 'user .?// Check if admin? ?') {   print('You are a regular user.'); } else {   print('You are an admin.'); }}

CVE-2021–42574 https://nvd.nist.gov/vuln/detail/CVE-2021-42574

您可能會認為該程序會打印出 You are a regular user.,但實際上它打印出的是 You are an admin.!通過使用包含雙向 Unicode 字符的字符串,您就可能會造成這一漏洞。這些雙向字符針對在同一行的文本,可以將文本的方向由從左到右更改為從右到左,反之亦然。雙向字符文本在屏幕上的呈現(xiàn)與實際文本內容截然不同。您可以進一步查看此 GitHub gist 示例:

https://gist.github.com/mit-mit/7dda00ca6278ce7d2555f78d59d9e67b?h=1

針對此漏洞的緩解措施包括使用檢測雙向 Unicode 字符的工具 (編輯器、代碼審查工具等),以便開發(fā)者發(fā)現(xiàn)它們,并在知情的情況下使用這些字符。上面提到的 GitHub gist 文件查看器便是發(fā)現(xiàn)這些字符的工具的一個例子。

Dart 2.15 引入了進一步的緩解措施 (Dart 安全建議CVE-2021–22567)?,F(xiàn)在,Dart 分析器會掃描雙向 Unicode 字符,并標記對它們的任何使用:

$ dart analyzeAnalyzing cvetest...                   2.6sinfo ? bin/cvetest.dart:4:27 ? The Unicode code point 'U+202E'      changes the appearance of text from how it's interpreted      by the compiler. Try removing the code point or using the      Unicode escape sequence 'u202E'. ?      text_direction_code_point_in_literal

Dart 安全建議 CVE-2021–22567 https://github.com/dart-lang/sdk/security/advisories/GHSA-8pcp-6qc9-rqmv

我們建議用 Unicode 轉義序列替換這些字符,這樣它們就可在任何文本編輯器或查看器中顯示出來?;蛘?,如果您確實正當使用了這些字符,您可以在使用這些字符的代碼行之前添加覆蓋語句來禁用警告:

// ignore: text_direction_code_point_in_literal

使用第三方 pub 服務器時的 pub.dev 憑據(jù)漏洞 (CVE-2021–22568)

我們也發(fā)布了第二個與 pub.dev 相關的 Dart 安全建議:CVE-2021–22568。此建議針對可能將 package 發(fā)布到第三方 pub package 服務器 (例如私人或公司內部 package 服務器) 的 package 發(fā)布者。僅將 package 發(fā)布到公開 pub.dev repo (標準配置) 的開發(fā)者不受此漏洞的影響。

CVE-2021–22568 https://github.com/dart-lang/sdk/security/advisories/GHSA-r32f-vhjp-qhj7

如果您已經將 package 發(fā)布至第三方 repo,那么漏洞是:用于在第三方 repo 進行身份驗證的 OAuth2 臨時 (一小時) 訪問令牌可能被誤用,以在公開 pub.dev repo 上進行身份驗證。因此惡意的第三方 pub 服務器可能會使用訪問令牌,在 pub.dev 上冒充您,并發(fā)布 package。如果您已經將 package 發(fā)布到一個不受信任的第三方 package repo,請考慮審查您的帳號在 pub.dev 公開 package repo 上的所有活動。我們推薦您使用 pub.dev 活動日志進行查看:

https://pub.dev/my-activity-log

最后

希望您喜歡已經推出的 Dart 2.15 中的新功能。這是我們今年的最后一個版本,我們想借此機會表達我們對美妙的 Dart 生態(tài)系統(tǒng)的感謝。感謝大家的寶貴反饋,以及對我們一直以來的支持,感謝大家在過去的一年中在 pub.dev 上發(fā)布的數(shù)千個 package,它們豐富了我們的生態(tài)系統(tǒng)。我們迫切期待明年再次投入工作,我們計劃在 2022 年推出很多激動人心的內容。預祝大家新年快樂,好好享受即將到來的假期吧!

原文標題:Dart 2.15 現(xiàn)已發(fā)布

文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4237

    瀏覽量

    61969
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1006

    瀏覽量

    45421
  • GitHub
    +關注

    關注

    3

    文章

    461

    瀏覽量

    16236

原文標題:Dart 2.15 現(xiàn)已發(fā)布

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Android for BBB準備repo 下載源碼

    repo init -u git://github.com/hendersa/bbbandroid-manifest.git -m bbbandroid-aosp-4.4.4_r1-3.8.xml然后使用repo sync 命令
    發(fā)表于 08-04 11:32

    請問如何從codeaurora遷移到github?

    我注意到最近恩智浦存儲庫從 codeaurora 轉移到了 github。我們如何在仍然使用 BSP31 的同時更改它,因為我們目前沒有時間遷移到更新的 BSP 版本。在版本 31 的新 github repo 中,.xml 文
    發(fā)表于 04-07 06:35

    將codeaurora遷移到github后如何下載BSP30.0 yocto repo?

    你好呀似乎最近 NXP repos 從 codeaurora 轉移到了 github。如何從 github 下載 BSP33.0。在我像打擊一樣初始化回購之后 repo init -u https
    發(fā)表于 04-20 09:34

    什么叫公共耦合?及公共耦合什么影響

    什么叫公共耦合?及公共耦合什么影響     什么叫公共耦合?     當兩個電路的地電流流過一個
    發(fā)表于 03-21 17:57 ?7188次閱讀
    什么叫<b class='flag-5'>公共</b>耦合?及<b class='flag-5'>公共</b>耦合<b class='flag-5'>有</b>什么影響

    github是什么_github什么用

    gitHub是一個面向開源及私有軟件項目的托管平臺,因為只支持git 作為唯一的版本庫格式進行托管,故名gitHub。gitHub于2008年4月10日正式上線,除了git代碼倉庫托管
    發(fā)表于 11-29 16:19 ?2.1w次閱讀

    github使用教程_github菜鳥教程

    GitHub 擁有一個非常鼓勵合作的社區(qū)氛圍。這一方面源于 GitHub 的付費模式:私有項目需要付費,而公共項目完全免費。這意味著 GitHub 上的大多數(shù)項目都是開源的,任何用戶都
    發(fā)表于 11-29 17:22 ?1.5w次閱讀
    <b class='flag-5'>github</b>使用教程_<b class='flag-5'>github</b>菜鳥教程

    程序員如何以合規(guī)手段快速獲得GitHub上千Star?

    除此之外,這個 repo 和代碼毫無關系嗎?好像也不是的。網站是代碼寫出來的,issue 里也有對 GitHub Pages、webp 文件格式支持、自動去除 EXIF、使用 lazy load 等的討論。就算真的沒有代碼,問題
    的頭像 發(fā)表于 01-29 10:18 ?2767次閱讀

    GitHub遭黑客攻擊,受害者需支付3800元用以恢復丟失的代碼并避免泄漏

    五一過后,一些程序員查看自己托管到GitHub上的代碼時發(fā)現(xiàn),他們的源代碼和Repo都已消失不見,上周四,一位Reddit用戶寫了一篇帖子,說他的存儲庫被黑了。
    的頭像 發(fā)表于 05-06 10:24 ?2673次閱讀

    到底是什么原因讓Balazs覺得中文repo“霸榜”是在破壞GitHub Trending?

    repo,尤其是中文 repo,前 10 個里 9 個都是中文 repo,為此他截了一張 GitHub Trending 頁面的圖作證,
    的頭像 發(fā)表于 07-21 07:43 ?1867次閱讀

    中文repo霸榜GitHub Trending,你怎么看?

    repo,尤其是中文 repo,前 10 個里 9 個都是中文 repo,為此他截了一張 GitHub Trending 頁面的圖作證,
    的頭像 發(fā)表于 07-21 09:18 ?2107次閱讀

    歷時兩周,微軟終刪除GitHub上泄露的Windows XP源代碼

    泄漏近兩周之后,微軟終于動手刪除了 GitHub 上遭到泄漏的 Windows XP 源代碼。
    的頭像 發(fā)表于 10-12 12:02 ?2245次閱讀

    Repo2Docker將git repo轉換為Docker鏡像

    ./oschina_soft/repo2docker.zip
    發(fā)表于 05-13 10:44 ?1次下載
    <b class='flag-5'>Repo</b>2Docker將git <b class='flag-5'>repo</b>轉換為Docker鏡像

    Secret-Socks-Extend ssh代理客戶端

    ./oschina_soft/Secret-Socks-Extend.zip
    發(fā)表于 05-26 15:05 ?1次下載
    <b class='flag-5'>Secret</b>-Socks-Extend ssh代理客戶端

    如何規(guī)避 Secret 泄露風險

    在 K8s 的管理過程中,像 Secret 這種資源并不好維護,KubeSeal 提供了一種相對簡單的方式來對原始 Secret 資源進行加密,并通過控制器進行解密,以此來規(guī)避 Secret 泄露風險。
    的頭像 發(fā)表于 09-26 11:07 ?1188次閱讀

    如何本地運行和測試Github Actions?

    一般來說,使用 Github Actions 都需要在 Repo 里完成相應的 event 才能夠觸發(fā)(比如push/pull_request等),然后在 Github 提供的服務器(容器)中運行。
    的頭像 發(fā)表于 08-02 16:44 ?2257次閱讀
    如何本地運行和測試<b class='flag-5'>Github</b> Actions?