博客

  • 尼康Z5II开启影像创作技术与艺术对话新篇

    尼康Z5II开启影像创作技术与艺术对话新篇

    在摄影器材“参数内卷”的当下,尼康Z5II的诞生犹如一场静默的革命。它并非简单地堆砌像素或提升帧率,而是以“色彩科学”为原点,将影像创作升华为一场技术与艺术的深度对话。当创作者手握Z5II,按下快门的瞬间,不仅是在记录画面,更是在用尼康构建的视觉语法系统,书写属于自己的光影史诗。

    尼康Z5II开启影像创作技术与艺术对话新篇

    尼康Z5II

    电商报价¥10999¥11716¥10999

    尼康Z5II的色彩哲学,始于对“视觉语言”本质的叩问。当大多数相机将色彩简化为后期调校的参数,Z5II却选择与全球顶尖创摄者联手,将9种云优化校准方案锻造成创作者的“风格基因库”。

    当EXPEED 7影像处理器以10倍算力撕裂传统影像的时空维度,进化为预判创作者意图的“视觉先知”。支持30幅/秒C30模式的高速连拍,配合0.02秒的自动对焦速度,让Z5II能捕捉到人类视觉难以察觉的瞬间。婚礼跟拍中,新郎拭泪的指尖颤动、新娘头纱扬起的弧度,都被凝固为永恒的视觉诗篇。

    在Z5II的镜头下,人像摄影突破了“真实复刻”的局限,进化为对“美”的重新定义。结合尼康的AI肤色算法,Z5II能根据环境光色温自动调整肤色倾向。在暖调夕阳下,肤色呈现蜂蜜般的温润质感;冷调月光中,则泛起珍珠母贝的微光。这种对“色彩情绪”的极致把控,让每一张人像都成为创作者与模特的视觉共谋。

    尼康Z5II开启影像创作技术与艺术对话新篇

    其以色彩、速度、视角为支点,构建起一个开放的创作生态系统。结合尼克尔Z 28-400mm f/4-8 VR镜头,可以14.3倍变焦覆盖从城市全景到野生动物特写的全场景需求。VR减震技术让长焦端手持拍摄如履平地,创作者无需被“换镜焦虑”打断叙事节奏。

    在摄影创作的漫漫征途中,尼康Z5II宛如一位贴心且深谙艺术的挚友,以独特的方式为创作者们带来了重新定义“创作自由”的珍贵契机。它摒弃了传统器材的冰冷与生硬,化作一位沉默而温暖的视觉导师,静静地陪伴在创作者身旁。选择Z5II助力创作者定格每一个唯美时刻。

    尼康Z5II

    主要性能产品型号Z5II上市日期2025年04月产品类型微单操作方式全自动操作传感器类型背照式CMOS传感器尺寸全画幅(35.9*23.9mm)传感器描述影像传感器格式:FX最大像素数2528万有效像素2450万影像处理器EXPEED 7最高分辨率6048×4032图像分辨率[FX (36 x 24)]影像区域:
    (L) 6048 x 4032 (约2,440万), (M) 4528 x 3024 (约1,370万), (S) 3024 x 2016 (约610万)
    [DX (24 x 16)]影像区域:
    (L) 3984 x 2656 (约1,060万), (M) 2976 x 1992 (约590万), (S) 1984 x 1328 (约260万)
    [1:1 (24 x 24)]影像区域:
    (L) 4032 x 4032 (约1,630万), (M) 3024 x 3024 (约910万), (S) 2016 x 2016 (约410万)
    [16:9 (36 x 20)]影像区域:
    (L) 6048 x 3400 (约2,060万), (M) 4528 x 2544 (约1,150万), (S) 3024 x 1696 (约510万)高清摄像4K超高清视频(2160)适用对象入门级
    镜头特点镜头卡口尼康Z卡口对焦方式自动对焦对焦点数273个(单次伺服AF),299个(自动区域AF)
    显示功能显示屏类型触摸屏,翻转屏显示屏尺寸3.2英寸显示屏像素210万像素液晶屏特性约170°可视角度、约100% 画面覆盖率的可翻转TFT LCD触摸屏,具备色彩平衡和15档手动亮度控制实时取景支持取景器类型电子取景器描述约1.27cm(约0.5英寸)、约369万画点(Quad VGA)OLED电子取景器,可调整色彩平衡,具备自动以及13档手动亮度控制
    画面覆盖率:水平和垂直约100%
    放大倍率:约0.8倍(50mm 镜头设为无限远,屈光度为-1.0m)
    视点:21mm (屈光度为-1.0m;距离取景器接目镜表面中心)
    屈光度调节:-4至+2m
    眼感应:在显示屏和取景器显示之间自动切换
    快门性能快门类型电子控制纵走式焦平面快门,电子前帘快门,电子快门快门速度1/8000至30秒(以1/3EV为增量,M模式下可扩展至900秒)、B门、遥控B门
    闪光灯闪光灯类型外接外接闪光灯(热靴)支持闪光模式前帘同步,慢同步,后帘同步,防红眼,慢同步带防红眼,关闭其它闪光灯性能闪光控制:TTL:i-TTL闪光控制;i-TTL均衡补充闪光配合矩阵测光、中央重点测光、亮部重点测光一起使用,标准i-TTL补充闪光配合点测光一起使用
    闪光补偿:-3至+1EV
    尼康创意闪光系统(CLS):i-TTL闪光控制、光学无线闪光、模拟闪光、FV锁定、色彩信息交流、自动FP高速同步
    曝光控制曝光模式自动曝光,程序自动曝光(P),光圈优先(A),快门优先(S),手动曝光(M)曝光补偿±5EV(以1/3和1/2为增量)测光方式矩阵测光,中央重点测光,点测光白平衡自动(3种类型),自然光自动适应,晴天,阴天,背阴,白炽灯,荧光灯(3种类型),闪光灯,选择色温(2500K至10000K),手动预设(最多可保存6个值),均可进行微调感光度照片:ISO 100-64000
    视频:ISO 100-51200其它曝光性能动态D-lighting:自动、高+、高、标准、低、关闭
    多重曝光:叠加、平均、亮化、暗化
    拍摄性能防抖性能5轴防抖自拍功能2秒,5秒,0秒,20秒;以0.5,1,2或3秒为间隔曝光1-9 次连拍功能最高约30张/秒
    低速连拍:约1-7张/秒
    高速连拍:约7.8张秒(快门类型设置为[自动]或[M]档时);约9.4张/秒(快门类型设置为[电子前帘快门]时);约10幅/秒(静音模式开启时)
    高速连拍(延长):约14张/秒;约15张/秒(静音模式开启时)
    高速画面捕捉+(C15):约15张/秒
    高速画面捕捉+(C30):约30张/秒录音/音频系统支持
    存储参数存储卡类型SD/SDHC (兼容UHS-II)/SDXC (兼容UHS-II)文件格式NEF(RAW):14 位; 从无损压缩、高效率(高)和高效率选项中进行选择
    JPEG:兼容JPEG-Baseline,压缩比为精细(约1 : 4)、标准(约1 : 8)或基本(约1 : 16); 文件大小优先和良好品质压缩可用
    HEIF:支持精细(约1 : 4)、标准(约1 : 8)或基本(约1 : 16)
    电池性能电池类型EN-EL15c锂电池
    其它参数产品接口Type-C,HDMI,3.5mm立体声迷你针式插孔无线功能WiFi,蓝牙5.0机身马达支持产品功能VLOG拍摄麦克风/扬声器支持,内置立体声或外置麦克风其它性能快门释放模式:单张拍摄,低速连拍,高速连拍,高速连拍(延长),高速画面捕捉(支持预拍功能),自拍
    照片摄影的其他选项:暗角控制、衍射补偿、自动失真控制、皮肤柔化、人像印象平衡以及间隔摄影、对焦点位移和像素位移摄影
    视频拍摄其他选项:延时视频、电子VR减震、时间码、N-Log和HDR(HLG)视频输出、波形显示、红色REC框显示、视频录像显示缩放(50%、100%、200%和400%)、扩展快门速度(S和M模式)、RAW 视频的双格式(代理视频)录制;可通过i菜单查看视频录制信息的选项;高分辨率变焦
    双存储卡插槽:2张SD卡工作环境温度:0°C-40°C
    湿度:85%-更低(不结露)
    外观设计外形特点大屏幕外形尺寸144×103×49mm产品重量约620g(仅机身),700g(包含电池和存储卡,但不包括机身盖和配件热靴盖)
    相机附件包装清单相机 x1
    DK-29 橡胶镜头盖(相机随附) x1
    BF-N1机身盖 x1
    带端子盖的EN EL15c锂离子电池组 x1
    AN-DC26背带 x1
    两端带Type-C连接器的USB线 x1

    *本信息来源于ZOL产品库

  • The V8 Sandbox

    The V8 Sandbox

    After almost three years since the initial design document and hundreds of CLs in the meantime, the V8 Sandbox — a lightweight, in-process sandbox for V8 — has now progressed to the point where it is no longer considered an experimental security feature. Starting today, the V8 Sandbox is included in Chrome’s Vulnerability Reward Program (VRP). While there are still a number of issues to resolve before it becomes a strong security boundary, the VRP inclusion is an important step in that direction. Chrome 123 could therefore be considered to be a sort of “beta” release for the sandbox. This blog post uses this opportunity to discuss the motivation behind the sandbox, show how it prevents memory corruption in V8 from spreading within the host process, and ultimately explain why it is a necessary step towards memory safety.

    Motivation

    Memory safety remains a relevant problem: all Chrome exploits caught in the wild in the last three years (2021 – 2023) started out with a memory corruption vulnerability in a Chrome renderer process that was exploited for remote code execution (RCE). Of these, 60% were vulnerabilities in V8. However, there is a catch: V8 vulnerabilities are rarely “classic” memory corruption bugs (use-after-frees, out-of-bounds accesses, etc.) but instead subtle logic issues which can in turn be exploited to corrupt memory. As such, existing memory safety solutions are, for the most part, not applicable to V8. In particular, neither switching to a memory safe language, such as Rust, nor using current or future hardware memory safety features, such as memory tagging, can help with the security challenges faced by V8 today.

    To understand why, consider a highly simplified, hypothetical JavaScript engine vulnerability: the implementation of JSArray::fizzbuzz(), which replaces values in the array that are divisible by 3 with “fizz”, divisible by 5 with “buzz”, and divisible by both 3 and 5 with “fizzbuzz”. Below is an implementation of that function in C++. JSArray::buffer_ can be thought of as a JSValue*, that is, a pointer to an array of JavaScript values, and JSArray::length_ contains the current size of that buffer.

    for (int index = 0; index < length_; index++) {
      JSValue js_value = buffer_[index];
      int value = ToNumber(js_value).int_value();
      if (value % 15 == 0)
        buffer_[index] = JSString("fizzbuzz");
      else if (value % 5 == 0)
        buffer_[index] = JSString("buzz");
      else if (value % 3 == 0)
        buffer_[index] = JSString("fizz");
    }

    Seems simple enough? However, there’s a somewhat subtle bug here: the ToNumber conversion in line 3 can have side effects as it may invoke user-defined JavaScript callbacks. Such a callback could then shrink the array, thereby causing an out-of-bounds write afterwards. The following JavaScript code would likely cause memory corruption:

    let array = new Array(100);
    let evil = { [Symbol.toPrimitive]() { array.length = 1; return 15; } };
    array.push(evil);
    // At index 100, the @@toPrimitive callback of |evil| is invoked in
    // line 3 above, shrinking the array to length 1 and reallocating its
    // backing buffer. The subsequent write (line 5) goes out-of-bounds.
    array.fizzbuzz();

    Note that this vulnerability could occur both in hand-written runtime code (as in the example above) or in machine code generated at runtime by an optimizing just-in-time (JIT) compiler (if the function was implemented in JavaScript instead). In the former case, the programmer would conclude that an explicit bounds-check for the store operations is not necessary as that index has just been accessed. In the latter case, it would be the compiler drawing the same incorrect conclusion during one of its optimization passes (for example redundancy elimination or bounds-check elimination) because it doesn’t model the side effects of ToNumber() correctly.

    While this is an artificially simple bug (this specific bug pattern has become mostly extinct by now due to improvements in fuzzers, developer awareness, and researcher attention), it is still useful to understand why vulnerabilities in modern JavaScript engines are difficult to mitigate in a generic way. Consider the approach of using a memory safe language such as Rust, where it is the compiler’s responsibility to guarantee memory safety. In the above example, a memory safe language would likely prevent this bug in the hand-written runtime code used by the interpreter. However, it would not prevent the bug in any just-in-time compiler as the bug there would be a logic issue, not a “classic” memory corruption vulnerability. Only the code generated by the compiler would actually cause any memory corruption. Fundamentally, the issue is that memory safety cannot be guaranteed by the compiler if a compiler is directly part of the attack surface.

    Similarly, disabling the JIT compilers would also only be a partial solution: historically, roughly half of the bugs discovered and exploited in V8 affected one of its compilers while the rest were in other components such as runtime functions, the interpreter, the garbage collector, or the parser. Using a memory-safe language for these components and removing JIT compilers could work, but would significantly reduce the engine’s performance (ranging, depending on the type of workload, from 1.5–10× or more for computationally intensive tasks).

    Now consider instead popular hardware security mechanisms, in particular memory tagging. There are a number of reasons why memory tagging would similarly not be an effective solution. For example, CPU side channels, which can easily be exploited from JavaScript, could be abused to leak tag values, thereby allowing an attacker to bypass the mitigation. Furthermore, due to pointer compression, there is currently no space for the tag bits in V8’s pointers. As such, the entire heap region would have to be tagged with the same tag, making it impossible to detect inter-object corruption. As such, while memory tagging can be very effective on certain attack surfaces, it is unlikely to represent much of a hurdle for attackers in the case of JavaScript engines.

    In summary, modern JavaScript engines tend to contain complex, 2nd-order logic bugs which provide powerful exploitation primitives. These cannot be effectively protected by the same techniques used for typical memory-corruption vulnerabilities. However, nearly all vulnerabilities found and exploited in V8 today have one thing in common: the eventual memory corruption necessarily happens inside the V8 heap because the compiler and runtime (almost) exclusively operate on V8 HeapObject instances. This is where the sandbox comes into play.

    The V8 (Heap) Sandbox

    The basic idea behind the sandbox is to isolate V8’s (heap) memory such that any memory corruption there cannot “spread” to other parts of the process’ memory.

    As a motivating example for the sandbox design, consider the separation of user- and kernel space in modern operating systems. Historically, all applications and the operating system’s kernel would share the same (physical) memory address space. As such, any memory error in a user application could bring down the whole system by, for example, corrupting kernel memory. On the other hand, in a modern operating system, each userland application has its own dedicated (virtual) address space. As such, any memory error is limited to the application itself, and the rest of the system is protected. In other words, a faulty application can crash itself but not affect the rest of the system. Similarly, the V8 Sandbox attempts to isolate the untrusted JavaScript/WebAssembly code executed by V8 such that a bug in V8 does not affect the rest of the hosting process.

    In principle, the sandbox could be implemented with hardware support: similar to the userland-kernel split, V8 would execute some mode-switching instruction when entering or leaving sandboxed code, which would cause the CPU to be unable to access out-of-sandbox memory. In practice, no suitable hardware feature is available today, and the current sandbox is therefore implemented purely in software.

    The basic idea behind the software-based sandbox is to replace all data types that can access out-of-sandbox memory with “sandbox-compatible” alternatives. In particular, all pointers (both to objects on the V8 heap or elsewhere in memory) and 64-bit sizes must be removed as an attacker could corrupt them to subsequently access other memory in the process. This implies that memory regions such as the stack cannot be inside the sandbox as they must contain pointers (for example return addresses) due to hardware and OS constraints. As such, with the software-based sandbox, only the V8 heap is inside the sandbox, and the overall construction is therefore not unlike the sandboxing model used by WebAssembly.

    To understand how this works in practice, it is useful to look at the steps an exploit has to perform after corrupting memory. The goal of an RCE exploit would typically be to perform a privilege escalation attack, for example by executing shellcode or performing a return-oriented programming (ROP)-style attack. For either of these, the exploit will first want the ability to read and write arbitrary memory in the process, for example to then corrupt a function pointer or place a ROP-payload somewhere in memory and pivot to it. Given a bug that corrupts memory on the V8 heap, an attacker would therefore look for an object such as the following:

    class JSArrayBuffer: public JSObject {
      private:
        byte* buffer_;
        size_t size_;
    };

    Given this, the attacker would then either corrupt the buffer pointer or the size value to construct an arbitrary read/write primitive. This is the step that the sandbox aims to prevent. In particular, with the sandbox enabled, and assuming that the referenced buffer is located inside the sandbox, the above object would now become:

    class JSArrayBuffer: public JSObject {
      private:
        sandbox_ptr_t buffer_;
        sandbox_size_t size_;
    };

    Where sandbox_ptr_t is a 40-bit offset (in the case of a 1TB sandbox) from the base of the sandbox. Similarly, sandbox_size_t is a “sandbox-compatible” size, currently limited to 32GB.
    Alternatively, if the referenced buffer was located outside of the sandbox, the object would instead become:

    class JSArrayBuffer: public JSObject {
      private:
        external_ptr_t buffer_;
    };

    Here, an external_ptr_t references the buffer (and its size) through a pointer table indirection (not unlike the file descriptor table of a unix kernel or a WebAssembly.Table) which provides memory safety guarantees.

    In both cases, an attacker would find themselves unable to “reach out” of the sandbox into other parts of the address space. Instead, they would first need an additional vulnerability: a V8 Sandbox bypass. The following image summarizes the high-level design, and the interested reader can find more technical details about the sandbox in the design documents linked from src/sandbox/README.md.

    A high-level diagram of the sandbox design

    Solely converting pointers and sizes to a different representation is not quite sufficient in an application as complex as V8 and there are a number of other issues that need to be fixed. For example, with the introduction of the sandbox, code such as the following suddenly becomes problematic:

    std::vector<std::string> JSObject::GetPropertyNames() {
        int num_properties = TotalNumberOfProperties();
        std::vector<std::string> properties(num_properties);
    
        for (int i = 0; i < NumberOfInObjectProperties(); i++) {
            properties[i] = GetNameOfInObjectProperty(i);
        }
    
        // Deal with the other types of properties
        // ...

    This code makes the (reasonable) assumption that the number of properties stored directly in a JSObject must be less than the total number of properties of that object. However, assuming these numbers are simply stored as integers somewhere in the JSObject, an attacker could corrupt one of them to break this invariant. Subsequently, the access into the (out-of-sandbox) std::vector would go out of bounds. Adding an explicit bounds check, for example with an SBXCHECK, would fix this.

    Encouragingly, nearly all “sandbox violations” discovered so far are like this: trivial (1st order) memory corruption bugs such as use-after-frees or out-of-bounds accesses due to lack of a bounds check. Contrary to the 2nd order vulnerabilities typically found in V8, these sandbox bugs could actually be prevented or mitigated by the approaches discussed earlier. In fact, the particular bug above would already be mitigated today due to Chrome’s libc++ hardening. As such, the hope is that in the long run, the sandbox becomes a more defensible security boundary than V8 itself. While the currently available data set of sandbox bugs is very limited, the VRP integration launching today will hopefully help produce a clearer picture of the type of vulnerabilities encountered on the sandbox attack surface.

    Performance

    One major advantage of this approach is that it is fundamentally cheap: the overhead caused by the sandbox comes mostly from the pointer table indirection for external objects (costing roughly one additional memory load) and to a lesser extent from the use of offsets instead of raw pointers (costing mostly just a shift+add operation, which is very cheap). The current overhead of the sandbox is therefore only around 1% or less on typical workloads (measured using the Speedometer and JetStream benchmark suites). This allows the V8 Sandbox to be enabled by default on compatible platforms.

    Testing

    A desirable feature for any security boundary is testability: the ability to manually and automatically test that the promised security guarantees actually hold in practice. This requires a clear attacker model, a way to “emulate” an attacker, and ideally a way of automatically determining when the security boundary has failed. The V8 Sandbox fulfills all of these requirements:

    1. A clear attacker model: it is assumed that an attacker can read and write arbitrarily inside the V8 Sandbox. The goal is to prevent memory corruption outside of the sandbox.
    2. A way to emulate an attacker: V8 provides a “memory corruption API” when built with the v8_enable_memory_corruption_api = true flag. This emulates the primitives obtained from typical V8 vulnerabilities and in particular provides full read- and write access inside the sandbox.
    3. A way to detect “sandbox violations”: V8 provides a “sandbox testing” mode (enabled via either --sandbox-testing or --sandbox-fuzzing) which installs a signal handler that determines if a signal such as SIGSEGV represents a violation of the sandbox’s security guarantees.

    Ultimately, this allows the sandbox to be integrated into Chrome’s VRP program and be fuzzed by specialized fuzzers.

    Usage

    The V8 Sandbox must be enabled/disabled at build time using the v8_enable_sandbox build flag. It is (for technical reasons) not possible to enable/disable the sandbox at runtime. The V8 Sandbox requires a 64-bit system as it needs to reserve a large amount of virtual address space, currently one terabyte.

    The V8 Sandbox has already been enabled by default on 64-bit (specifically x64 and arm64) versions of Chrome on Android, ChromeOS, Linux, macOS, and Windows for roughly the last two years. Even though the sandbox was (and still is) not feature complete, this was mainly done to ensure that it does not cause stability issues and to collect real-world performance statistics. Consequently, recent V8 exploits already had to work their way past the sandbox, providing helpful early feedback on its security properties.

    Conclusion

    The V8 Sandbox is a new security mechanism designed to prevent memory corruption in V8 from impacting other memory in the process. The sandbox is motivated by the fact that current memory safety technologies are largely inapplicable to optimizing JavaScript engines. While these technologies fail to prevent memory corruption in V8 itself, they can in fact protect the V8 Sandbox attack surface. The sandbox is therefore a necessary step towards memory safety.

  • WordPress 6.8 正式版发布,优化网站性能

    WordPress 6.8 正式版发布,优化网站性能

    WordPress 6.8 完善并优化了您日常使用的工具,使您的网站运行速度更快、更安全、更易于管理。样式表现在采用结构化布局,并兼容经典主题,让您能够更好地控制全局样式。推测加载功能通过在用户导航到链接之前预加载链接来加快导航速度,bcrypt 哈希算法可自动增强密码安全性,数据库优化则可提升性能。

    文章目录

    样式书变得更加简洁,并且增加了一些新技巧

    样式书具有新的结构化布局和更清晰的标签,可以更轻松地在一个地方编辑颜色、排版(几乎所有网站样式)。

    此外,现在您可以在包含 editor-styles 或 theme.json 文件的经典主题中看到它。在“外观”>“设计”下找到“样式书”,并在编辑 CSS 或在定制器中进行更改时使用它来预览主题的演变。

    编辑器改进

    更轻松地查看数据视图中的选项,并可以从查询循环中排除置顶帖子。此外,编辑器中还有许多小改进,让您构建一切更加顺畅。

    得益于推测加载,页面加载几乎是即时的

    在 WordPress 6.8 中,页面加载速度比以往任何时候都快。当您或您的用户将鼠标悬停在链接上或点击链接时,WordPress 可能会预加载下一页,从而带来更流畅、近乎即时的体验。该系统会平衡速度和效率,您可以通过插件或自定义代码来控制其运行方式。此功能仅适用于现代浏览器——旧版浏览器会忽略它,不会产生任何影响。

    使用 bcrypt 增强密码安全性

    现在,使用 bcrypt 哈希算法,密码更难破解,这需要更强大的计算能力才能破解。这增强了整体安全性,WordPress 的其他加密改进也同样如此。您无需执行任何操作,所有内容都会自动更新。

    了解更多:WordPress 6.8 将使用 bcrypt 进行密码哈希处理

    辅助功能改进

    100 多项无障碍修复和增强功能,涵盖 WordPress 的广泛体验。此版本修复了所有捆绑主题,改进了导航菜单管理、自定义工具,并简化了标签功能。块编辑器针对块、数据视图及其整体用户体验进行了 70 多项改进。

    性能更新

    WordPress 6.8 包含一系列性能修复和增强功能,旨在提升从编辑到浏览的各项功能。除了预测加载之外,WordPress 6.8 还特别关注了块编辑器、块类型注册和查询缓存。此外,想象一下,任何交互的等待时间都不会超过 50 毫秒。在 WordPress 6.8 中,Interactivity API 朝着这一目标迈出了第一步。

    文章来自wordpress大学