1.performance.timerifyçbugs
2.知名压缩软件xz被发现有后门,目源码项目源码下影响有多大?如何应对?
3.James A. Woods全部作品
performance.timerifyçbugs
Node.jså®ç°W3CperformanceAPIå·²ç»æä¸æ®µæ¶é´äºï¼æè¿æåç°Node.jsè¿æä¾äºæ¹ä¾¿çHistogramAPIï¼å¯å¾å°å¹³åå¼ãæå°å¼ãæ大å¼ï¼ä¸ä½æ°ææå®çç¾åä½ãæ åå·®çã对äºå¸¸è§çå½æ°æ§è¡æ¶é´çç»è®¡éæ±ï¼å¯ä»¥ï¼import?{ performance,?createHistogram}?from?'perf_hooks'const?histogram?=?createHistogram()const?wrapped_fn?=?performance.timerify(fn,?{ histogram})doSth(wrapped_fn)?//?å é¨å¯è½å¤æ¬¡è°ç¨?wrapped_fnconsole.log(histogram.count,//?éæ ·æ¬¡æ°?histogram.min,//?æå°å¼histogram.percentile(),?//?ä¸ä½å¼histogram.mean,?//?å¹³åå¼histogram.stddev,?//?æ åå·®)performance.timerify(fn,{ histogram})ï¼Node.jsv+ï¼çæä¸ä¸ªå è£ å½æ°ï¼æ¯æ¬¡è°ç¨ä¼å¯¹fnçæ§è¡è®¡æ¶ï¼åä½ä¸ºçº³ç§ï¼å¹¶å°èæ¶åå ¥histogramãçä¸å»è¿ä¸ªAPIç¨æ¥åmicrobenchmarkè¿æ¯å¾æ¹ä¾¿çã
ç¶èæå¨ä½¿ç¨çæ¶åéå°äºbugââfnçè¿åå¼å¦ææ¯primitiveå¼ï¼å è£ å½æ°çè¿åå¼ä¼åæä¸ä¸ªç©ºå¯¹è±¡ãæå½æ¶åäºä¸ªfnä¼è¿ånullï¼å®ç»æå·æ¢æäºä¸ªå¯¹è±¡ï¼èªç¶æç¨åºææäºã
ç 究äºä¸çªåï¼æåç°å¦æfnæ¯æ®éå½æ°ï¼å³functionfn(){ }ï¼ï¼ä¼æ»æ¯ä»¥newfnæ¹å¼è°ç¨ã
å°Node.jsä»åºéæ¥æ¾äºä¸çªï¼å·²ç»æ人åäºIssue#ãä¹æè¯å¾ä¿®å¤çPR#ï¼ä½ä¸ç´æ²¡æ被åè¿å»ï¼å ä¸ºå ¶ä¿®å¤æ¹å¼å¹¶ä¸åçã
ä»è®¨è®ºä¸å¯è§ï¼åä½è çæå¾æ¯ï¼å¦ææ¯æé å¨ï¼é£ä¹å°±newä¹ï¼äºæ¯åäºç±»ä¼¼IsConstructor(fn)?newfn(...args):fn(...args)çé»è¾ï¼ä½å¿è®°äºæ®éå½æ°ä¹æ¯æé å¨ã
ãæ以æ个workaroundå°±æ¯åæç®å¤´å½æ°ââç®å¤´å½æ°ä¸æ¯æé å¨ãã
PRåæ¹ä¸ºäºç±»ä¼¼IsClass(fn)ãä½è¿å¯¼è´ä¼ ç»çéclassçæé å¨å°±ä¸ä¼ä»¥newæ¹å¼è°ç¨äºã尽管ES6ä¹åç»å¤§é¨åæ°ä»£ç é½å·²ç»ç¨classäºï¼ä½æ»è¿æ¯æè代ç ãå¦å¤è¿æä¸ç§æ åµæ¯ï¼ä»£ç æ¬èº«æ¯ä»¥classåçï¼ä½æ¯å¯è½åçå ä»ç¶æ¯è¢«ç¼è¯æES5äºã
ãæ¤å¤ï¼è¯¥PRçIsClassçå¤ææ¯éè¿/^\s*class/.test(fn.toString())è¿æ ·çhackæ¹å¼ï¼å¹¶ä¸é è°±ãæ¯å¦å 建æé å¨çtoString()ç»æ并ä¸ä¼ä»¥"class"å¼å¤´ï¼åæ¯å¦ï¼æç §ç®åstage3çdecoratorææ¡ï¼è¢«decoratoræ修饰çclassçtoString()ç»æä¼å å«decoratorï¼ä¹å°±æ¯ä»¥"@decoclass"å¼å¤´ï¼ï¼æªæ¥ä¹å¯è½å å«å ¶ä»ä¿®é¥°å ³é®åï¼æ¯å¦abstractãasyncãfinalãstaticçï¼ãã
å®é ä¸ï¼åççé»è¾å¹¶ä¸æ¯æ£æ¥fnæ¯å¦æ¯æé å¨ï¼èåºæ¯åæ ·ä¼ éè¯ä¹ââå è£ å½æ°å¨è¿éåºè¯¥æ¯ä¸ä¸ªä»£çã
åå¦ç¨Proxyå®ç°çè¯æ¯å¾ç®åçï¼å¤§ä½å¦ä¸ï¼
function?timerify(fn)?{ return?new?Proxy(fn,?{ construct(...args)?{ const?start?=?now()const?result?=?Reflect.construct(...args)processComplete(start)return?result},apply(...args)?{ const?start?=?now()const?result?=?Reflect.apply(...args)processComplete(start)return?result},}}ä¸è¿æ们å¯è½å¹¶ä¸æ³ç¨proxyãï¼æ¯å¦æ å¿proxyçæ§è½ï¼å¯è½é»æ¢å èï¼ï¼
å¦æç´æ¥åå è£ å½æ°åºè¯¥æä¹åå¢ï¼
é»è¾ä¸æ¯IsNew?newfn(...args):fn(...args)ï¼IsNew表示å½åæ§è¡å½æ°æ¯å¦æ¯ä»¥newè°ç¨çï¼ä½IsNewå¦ä½åï¼
ä¼ ç»ä¸ï¼æ们å¯ä»¥ç¨instanceofæ¥å¤å®ï¼
function?timerify(fn)?{ return?function?timerified(...args)?{ const?start?=?now()const?result?=?this?instanceof?timerifiednew?fn(...args)?:?fn.call(this,?...args)processComplete(start)return?result}}ä¸è¿ç°å¨å¯ä»¥ç¥åºæ´ç²¾ç¡®çnew.targetè¿ä¸ªå å±æ§ï¼metapropertyï¼ï¼
function?timerify(fn)?{ return?function?(...args)?{ const?start?=?now()const?result?=?new.targetReflect.construct(fn,?args,?new.target):?Reflect.apply(fn,?this,?args)processComplete(start)return?result}}ã注æReflect.constructç第ä¸ä¸ªåæ°ï¼å¨å½åå®ç°ä¸æ¯æ²¡æä¼ éçãè¿æå³çå½åå®ç°ä¹ä¸è½æ£ç¡®å¤çå类继æ¿å¦classXextendstimerify(Base)çæ å½¢ãã
æ´è¿ä¸æ¥è¯´ï¼timerifyæ好åFunction.prototype.bindä¸æ ·ï¼å¦æfnä¸æ¯æé å¨ï¼è¿åçå è£ å½æ°ä¹ä¸æ¯æé å¨ã
ãè¦è¿åä¸ä¸ªéæé å¨çå½æ°ï¼å¯ä»¥ä½¿ç¨ä¸ä¸ªåé¨å°æå·§ââç®åå½¢å¼æ¹æ³ä¸æ¯æé å¨ï¼æ以å¯ä»¥åæï¼return{ fn(){ ...}}.fnãã
PS.å¨ç 究è¿ä¸ªbugæ¶ï¼ææ¥çäºtimerifyæºç ï¼å¹¶åç°äºå¦å¤ä¸¤ä¸ªbug?ï¼äºæ¯å»å¼äºissueã
第ä¸ä¸ªissueæ¯performance.timerify(fn,options)alwaysreturnthesametimerifedfunction·Issue#·nodejs/nodeã
å½åå®ç°ç»è添足å°åäºç¼åï¼å³å¤æ¬¡timerify(fn)çç»æè¿ååä¸ä¸ªå½æ°ãç¶èæ们å¯è½æéæ±è¦ä¸ºåä¸ä¸ªfn产çå¤ä¸ªå è£ å½æ°ï¼æ¯å¦ä¸ºç¸åå½æ°å¨ä¸ååºæ¯ç使ç¨çæä¸åçç»è®¡å½æ°ï¼
let?h1?=?perf_hooks.createHistogram()let?h2?=?perf_hooks.createHistogram()let?f1?=?perf_hooks.performance.timerify(f,?{ histogram:?h1})let?f2?=?perf_hooks.performance.timerify(f,?{ histogram:?h2})f1?!==?f2?//?expect?true,?actual?falseç»æè°ç¨f2çç¨æ¶æ°æ®å¹¶ä¸ä¼åå ¥h2ï¼èæ¯ä¹åå ¥äºh1ã
第äºä¸ªissueæ¯performance.timerify(fn)behaveinconsistentlyforsync/asyncfunctions·Issue#·nodejs/nodeã
timerify对å¼æ¥å½æ°ï¼æææè¿åpromiseçå½æ°ï¼åäºç¹æ®å¤çï¼è®¡æ¶ä¸æ¯å°å½æ°è°ç¨ç»æï¼è¿åpromiseï¼ä¹æ¶ï¼èæ¯å°promiseå®æä¹åãè¿ç¬¦å大é¨å使ç¨è çç´è§ãä½å½åå®ç°ä¸æ¯ä½¿ç¨thenè°ç¨ï¼èæ¯å次ç»è添足å°ä½¿ç¨äºfinallyè°ç¨ãPromise.prototype.finallyä¼ç¡®ä¿æ 论æå失败æ»æ¯è°ç¨ï¼çä¸å»ä¼¼ä¹æ´ãå®å ¨ãï¼ä½å®é ä¸å¨è¿é使ç¨finallyï¼ä¼å¯¼è´å¼æ¥å½æ°åéå¼æ¥å½æ°è°ç¨ç»æä¸ä¸è´ãå 为å è£ å½æ°è°ç¨fnæ¶å¹¶æ²¡æ使ç¨try...finallyæé ï¼å¦æthrowï¼å并ä¸ä¼å¯¹æ¬æ¬¡è°ç¨å®æ计æ¶ã
为äºç¡®ä¿ä¸è´ï¼è¦ä¹é½ä¸ç¨finallyï¼è¦ä¹é½ç¨finallyãäºå®ä¸ï¼ä¹æ以promiseä¸çè¿ä¸ªæ¹æ³å½å为finallyï¼ä¹æ¯å¨æ示è¿ä¸ªæ¹æ³åtry...finallyç对åºæ§ãç¶èå¨æ¬ä¾ä¸è¿æ¯è¢«æ è§äºâ¦â¦
é£ä¹å°åºæ¯å¦åºè¯¥ç¨finallyå¢ï¼ä¸åºè¯¥ç¨ãå 为æ们计æ¶æ¯å¸ææµéå½æ°çè¿è¡æ¶é´ï¼throwæreject表æ并没æå®æå½æ°çæ£å¸¸è®¡ç®é»è¾ï¼ä¸ç¬¦åæ们çç»è®¡ç®æ ï¼ä¸åºè¯¥è¢«è®¡æ¶ã
ãå³ä½¿è¦ç¨finallyï¼å½åå®ç°ä¸çé»è¾if(result?.finally)result.finally(...)ä¹æ¯æé®é¢çãå 为promiseææè°thenableçæ å¿æ¯thenæ¹æ³èä¸æ¯finallyæ¹æ³ãä¾èµfinallyæ¹æ³å°±åä¸é¢æå°çä¾èµtoStringçç»æä¸æ ·ä¸ä¸¥è°¨ãã
æ»ç»ï¼å代ç è¦åå°ä¸¥è°¨æ¯ä¸å®¹æçãå³ä½¿æ¯Node.jsè¿æ ·çææ项ç®ï¼å³ä½¿æ¯åºèªJamesMSnellè¿æ ·çèµæ·±ç¨åºåä¹æï¼å³ä½¿æ¯ä¸ä¸ªå¹¶ä¸ç®å¤ªå¤æçAPIï¼å³ä½¿åªæè¡ä»£ç â¦â¦ä¹å¯è½æ½èåç§é®é¢ã
ãå½ç¶ï¼æ们å¯ä»¥å·Node.jsç代ç è´¨éä¹ä¸è¿å°å°ï¼å ¶å®å°±ç®JSå¼æ代ç ï¼ä¹ç»å¸¸åºbugï¼å¦/post/
知名压缩软件xz被发现有后门,影响有多大?如何应对?
知名压缩软件xz被发现存在后门,这一问题的目源码项目源码下揭露是由Andres Freund发现sshd进程的CPU占用率异常后进行的深入调查所促成的。
对比分析有后门的目源码项目源码下m4脚本与原版,很难发现其中存在的目源码项目源码下问题。然而,目源码项目源码下通过执行命令`grep -aErls "#{ 4}[[:alnum:]]{ 5}#{ 4}$" ./`在源码根目录下,目源码项目源码下apache ant 源码发现执行结果指向了`./tests/files/bad-3-corrupt_lzma2.xz`文件。目源码项目源码下这个步骤揭示了文件名虽不直接明文出现在构建脚本中,目源码项目源码下但通过`grep`命令间接匹配并确认了恶意文件的目源码项目源码下存在。
进一步分析表明,目源码项目源码下`gl_[$1]_prefix=echo $gl_am_configmake | sed "s/.*\.//g"`这一行代码提取了恶意文件的目源码项目源码下扩展名`xz`,实际上对应于`xz`命令行工具的目源码项目源码下名称。这暗示了解压过程需要先安装`xz-utils`包。目源码项目源码下整个解压命令的目源码项目源码下执行环境主要针对Linux系统,而非非Linux系统。目源码项目源码下
该脚本通过寻找并读取`config.status`文件来获取源码的根目录,这一过程考虑到许多发行版在编译时会单独建立`build`目录,因此`srcdir`变量保存了源码的位置。然后通过`export`命令随机读取内容,最终执行了一系列命令,其中包含多个行为,云够源码揭示了即使在非Debian或RPM系发行版中,尝试在`make`后再次执行`configure`时,也会通过其他途径执行感染。
对于Debian或RPM系发行版,恶意代码通过将上述恶意脚本注入到`Makefile`中实现,这个过程依赖于源码编译完成后才能进行。而真正感染部分在于将原本应编译自特定源文件的`liblzma_la-crc_fast.o`和`liblzma_la-crc_fast.o`目标文件链接为恶意对象文件,同时替换指令集扩展检测函数。正确的`get_cpuid`原型被故意修改,其中`__builtin_frame_address`旨在获取函数返回地址,facenet官方源码这可能在`x_`Linux上用于在寄存器中留下特定地址。
值得注意的是,发布带有后门的作者Jia Tan曾在两个月前与Sam James讨论过与GCC相关的bug导致`ifunc`函数符号覆盖功能不正确的问题,最终确认了这是一个GCC的bug。
提交代码时的实名要求对项目维护具有重要意义,尤其是当代码引发法律问题时。在Linux等重要项目中,有提交权限的人通常被强制要求实名。通过“签核”程序,开发者需在补丁说明末尾添加证明其身份的闪电砍价源码一行,确保贡献的合法性和追踪性。
项目中采用的签署选项有助于确定提交者和审查者的身份。在更严格的场合,代码提交可能需要使用GPG签名,而线下会议可能举办Key signing party来交换GPG公钥,确保线上身份与现实一致,并获得其他人的承认。实名制是维护代码质量和法律责任的关键,虚拟人物或匿名用户无法承担相应的法律责任。
James A. Woods全部作品
James A. Woods是代码美化 源码一位活跃在影视界的演员,他的作品丰富多样,涵盖了从早期到晚期的多个年份。以下是他的主要作品列表:年,他参与了**《源代码》的演出。
年,他主演了**《重回昨日》。
年,他在《死亡地带》中的表现也得到了认可。
年,他以演员的身份出演了《基情二加一》。
年,他参与了《乞赎的灵魂》的拍摄。
紧接着,他在年的《邪恶的永生》中也有精彩的表现。
年,他主演了《杰克·布鲁克斯之怪兽杀手》。
同一年,他还参与了**《Housesitter》的演出。
年,他在《Lance et compte》中的角色令人印象深刻。
年,他再次出演了《Big Wolf on Campus》。
年,他主演了续集**《Lance et compte: Le grand duel》。
年的《Naked Josh》是他作品中的一部。
年,他首次在**节上亮相,参与了《**节初哥》的演出。
年的《A Near Death Experience》也是他作品库中的一部分。
年的《生命交叉点》展示了他多面的角色诠释。
年的《Cyber Seduction: His Secret Life》是他数字化角色的代表作。
年的《Seriously Weird》则展现了他早期的演技魅力。
年,他在商业片《生意》中留下了足迹。
年的《The Watch》是他近年来的一部重要作品。
最后,在年的《Hatley High》中,他的表演同样引人关注。
James A. Woods通过这些作品积累了丰富的演艺经验,展示了他在不同角色中的精湛演技。