<html><body>
<p>On Tuesday, April 07, 2015 5:36 PM Richard Wordingham wrote:</p>
<p>On Tue, 7 Apr 2015 13:45:39 +0000 “Levantovsky, Vladimir” <Vladimir.Levantovsky@monotype.com> wrote:</p>
<blockquote><p>[VL] Well, I am no security expert but if you allow overlapping tables one can easily doctor the font file content (e.g. to modify table lengths / offsets in a table directory to create an overlap and use it as an exploit to load a malicious data. SFNT structure isn't bullet-proof and anyone can easily add arbitrary data to a font file, but at least you are protected to an extent because a custom table data won't be loaded by a font rasterizer. If table overlaps are allowed, a doctored font data can be used to force loading of malicious data.</p></blockquote>
<p>One can doctor the font file content without creating overlapping tables.  GSUB, GPOS, name and cmap tables can all contain large chunks of unreferenced data.  So also can the glyf table, but such chunks are easier to notice.  Many users would not notice if a kern table were removed, or severely truncated, as a way of modifying an existing font file without changing its size.</p>
<p>Note that I am not talking of overlapping tables <strong>within</strong> fonts, but <strong>between</strong> fonts.</p>
<p>[VL] I think we are talking about very different things using the same terms. Overlapping tables in my interpretation is when, within the same font, one table ends <em>after</em> another table begins (i.e., when offset_n + length_n > offset_n+1). You are talking about overlapping tables between fonts (I am not really sure what it means though), but if you are thinking about reusing parts of a table data by different fonts in a collection I call it table sharing. For example, a ‘glyf’ table can have many glyphs and each font in a collection can only use a subset of what is there. One ‘glyf’ table would in essence represent a union of different font subsets, but it is still one single table that doesn’t overlap with other tables.</p>
<blockquote><p>Moreover, WOFF2 prohibits fonts' tables overlapping without coinciding.  (A WOFF contains only one font.)  That strongly limits schemes that save space in uncompressed font collections.</p>
<p>[VL] Can you please elaborate on such a scheme?</p></blockquote>
<p>Some Tai Tham fonts accommodate printing constraints by limiting lines of text to three rows – one for base characters, one for marks above and one for marks below.  This includes handwritten camera-ready copy. I've noticed that in Northern Thailand there is little if any difference between the restrained glyphs used for these styles and the less restrained fonts where stacks are not constrained vertically. I am considering creating a variant of my unconstrained font which limits itself to three rows.</p>
<p>Now, I might declare that the unconstrained form was for Northern Thai and the constrained form was for Tai Khün.  Most of the GSUB and GPOS lookups would be the same, but there would be some lookups that differed.  I would simply select different lookups for different languages.  However, this assignment to languages would be dishonest.</p>
<p>Microsoft has very little support of typographical features for complex scripts.  Possibly I could exploit control of the calt and clig features.  All this assumes that the Universal Shaping Engine is modified to support Tai Tham, which Microsoft originally expected it to support.</p>
<p>It occurred to me that I could achieve similar compactness and consistency by generating a font collection instead.  I would organise a large GSUB table as follows:</p>
<p>GSUB_1_start: Offset from GSUB_1_start to script list for font 1 Offset from GSUB_1_start to common feature list Offset from GSUB_1_start to common lookup list Script list for font 1 GSUB_2_start: Offset from GSUB_2_start to script list for font 2 Offset from GSUB_2_start to common feature list Offset from GSUB_2_start to common lookup list Script list for font 2 Commmon feature list Language system tables, lookup list, tables and subsidiary data</p>
<p>The two fonts would reference different sets of feaure tables.</p>
<p>I have not started writing the code to generate such a font collection.  Nesting tables did look as though it would be difficult to control at font compilation time.  Conditional compilation directives are probably an easier way to go, with a font collection being stitched together from individual font files.</p>
<p>[VL] Ok, thank you for the explanation but IMO this has nothing to do with overlapping tables within a file (as explained earlier).</p>
<blockquote><p>WOFF2 also prohibits fonts sharing glyf but not loca (admittedly a perverse combination unless the last glyph in one font contains more than 3 bytes of ignored junk) and prohibits fonts from sharing loca but not glyf (a perverse combination or probably requiring the tweaking of the sizes of the glyph definitions).  This smacks of the authors being exhausted.</p>
<p>[VL] Where did you find this info? Why do you think WOFF2 has anything to do with prohibiting table sharing ('glyf' /'loca' or any other table for that matter)?</p></blockquote>
<p>WOFF File format 2.0 W3C Editors Draft 2 April 2015 (<a href="http://email.monotype.com/wf/click?upn=uA1u4oo8eyOFJ-2BcXH8sLkkZYEmDWlVONg6AVPNmy5M4Wk06JKOopu3DF5Gd6MVmc_J0Ubaei5HA3XL039ePvaTIKlP3BYkaS-2FPxqEvs36neeWFTQE5U-2BhZ6gQJWoj75KPpCS8DMrzSwVP57gNmZ1GpQcjZNVE-2FFON-2Bi1chVhmfLza0kAUVerIxlP2Q-2F-2Fn3GhTJ4F1McsXPtS1UCOEdaOXol0uLryRUaBSTp6M7ANbbVmaL-2FVwA9ppcyDWIZ3CVgWlJkJ-2FxyveqfKBDk4uzEvyBt-2B06YMKB40HAIpMZJUrejo-3D">http://dev.w3.org/webfonts/WOFF2/spec/</a>) Section 4.2 Paragraph 6 (ignoring tables):</p>
<p>“Sharing of glyf and loca tables is allowed and encouraged (this is one of the major benefits of a font collection); however, it is possible that font collections may have two or more pairs of the glyf / loca tables that may not be shared. When the tables are shared, an encoder MUST verify that both tables are shared and that both form an associated pair (if more than one pair of glyf / loca tables are present) and MUST reject a collection containing fonts that share only one of either glyf or loca table.”</p>
<p>[VL] The paragraph you refer to and the procedure outlined there is a simple security measure.</p>
<p>As you know, ‘loca’ table translates glyph indices (a logical reference to a glyph record) into glyph record offsets (a physical reference that is “hard-coded” to a particular ‘glyf’ table). If a font collection file contains multiple pairs of glyf/loca tables (which is unusual in a typical TTC scenario but possible considering a larger scope of an arbitrary font collection) – the association between the pairs of glyf/loca tables must be preserved so that a font rasterizer is able to find and read glyph records. Mixing wrong ‘glyf’ and ‘loca’ tables would have catastrophic consequences, and fonts in a font collection cannot <em>choose</em> to share one table of a pair but not the other. A font doesn’t have to use all of the glyphs (using only a subset from a shared ‘glyf’ table is fine, as we discussed earlier) but when using a shared ‘glyf’ table a font has to share the associated ‘loca’ table to find the glyph records you need – the subset in use by each font in a collection will be determined by ‘cmap’ table that translates codepoints to glyph indices.</p>
<p>When dealing with a font resource downloaded from a web server (and, hence, dealing with the built-in risks associated with possible malicious intent), WOFF2 decoders will attempt to analyze font structures and will invalidate anything that has wrong data – fonts with overlapping tables, fonts that share wrong glyf/loca pairs, or share one table but not the other, etc. Properly constructed font files (assuming they were built using tools that do things the right way) will not be affected, and it will sure have no effect on authors who produce font collections using those tools. I don't see any reason to be concerned about it.</p>
<p>Thank you, Vladimir</p>

<img src="http://email.monotype.com/wf/open?upn=J0Ubaei5HA3XL039ePvaTIKlP3BYkaS-2FPxqEvs36neeWFTQE5U-2BhZ6gQJWoj75KPpCS8DMrzSwVP57gNmZ1GpeaiClPb8ZMt1dLmqDwbPwbjDRJH4kIfz0oRUUUW0jwTXSj7nwfS8Qwwt6eBBuUD652ceMMXX-2Bwam646KgjIbodRy1Bi4ohaxqd0bgoXzvmc1DC5TRCa8uGAgEeLkmXTASbCZL1OH6iGq9-2B9g22BAxE-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;"/>
</body></html>