Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

カテゴリー: Security

AppleScriptでMyriad Tables Libが使えないケース

Posted on 7月 28 by Takaaki Naganoya

Myriad Tables Lib(最新版はv1.13)はShane StanleyによるAppleScriptライブラリで、かつてのClassic MacOSに存在していたGUI記述系のOSAX(名前は忘れた)を思わせるほど柔軟性が高いAppleScriptライブラリの逸品です。

自分としては、これを用いる場合でも過度な作り込みを行わず、編集可能なデータビューワー的な機能を手軽に追加するのがよいと感じています。

自分でもさらに機能を簡略化した「display table by list」ライブラリを用意しています。

macOS自体のセキュリティ制限により使えないケースも

ところが、本ライブラリが機能しないケースが確認されました。

特定の呼び方を行うと、ダイアログ+表の表示そのものが封じられるという、macOS側の新たな制限によるもののようです。

そのため、自分がmacOS 10.12用にAppleScriptで開発したシステムが、現在のmacOS 14.xで部分的に動かなくなってしまいました。目下、システムを改修中です。Myriad Tables Libを使って手抜きをしていた箇所を、すべて自力で表UI(NSTableView)を使って表示・編集する必要があるようです(けっこう大変)。

ステータスメニューから呼び出した場合にブロック

同システムはステータスメニューからタイマー機能を呼び出すようなシステムだったのですが、このメニューからMyriad Tables Libを呼び出すと、Xcode上で作成したAppleScriptアプリであっても、Script Debugger上で実行したAppleScriptであっても、表示がブロックされてしまいます。

ランタイム環境がどれであっても、ステータスメニューから呼び出してMyriad Tables Libによるテーブル表示は行えませんでした。

macOS 10.12:可能
macOS 10.13:不可
macOS 10.14:(未検証)
macOS 10.15:(未検証)
macOS 11.x:(未検証)
macOS 12.x:(未検証)
macOS 13.6:不可
macOS 14.6:不可
macOS 15β:(未検証)

これは、Script Debugger上で実行したAppleScriptから、ステータスメニュー上に動的に項目を作成し、そこにメニューを追加した場合でも、Xcode上で作成した場合でも同様の挙動が見られます。

Shaneに聞いてみた

その後、Shaneに実際に聞いてみたところ、ダイアログ表示をメインスレッド実行しないとできないらしい(意訳)ことが明らかになってきました。

ダメ元で表UIつきダイアログ表示を明示的にメインスレッド指定して実行してみたところ、ハネられました。

自作の「display table by list」ライブラリを同様に呼び出してみたところ、これも表示できませんでした。このライブラリは自分が作ったのでソースコードをすべて自分が管理しており、アラートダイアログの表示ハンドラをメインスレッド指定で呼び出しています。どの時点でメインスレッド指定実行しないとダメなのかは明確ではありませんが、割と八方ふさがりな状況です。

Posted in GUI Script Libraries Security | Tagged 13.0savvy 14.0savvy | Leave a comment

新発売:AppleScript基礎テクニック集(29)セキュリティ機能解除

Posted on 2月 15, 2023 by Takaaki Naganoya

Piymaru Softwareによる電子書籍の72冊目、「AppleScript基礎テクニック(29)セキュリティ機能解除」を発売しました。PDF 36ページ+サンプルScript Zipアーカイブで構成されています。

→ 販売ページ

macOS上の主要アプリケーション、FileMaker Pro、ミュージック.app、Webブラウザ、iWork(Keynote、Pages、Numbers)、CotEditorときて、ご要望の多かった「メール」(Mail.app)についてのScripting本です。macOS 13.1+Mail.app v16対応。PDF 369ページ+サンプルScript Zipアーカイブで構成されています。

macOS 10.7以降、それ自体の機能を制限するための「セキュリティ機能」が強化されるようになりました。つまり、機能を「制限する機能」です。macOS 10.10以降になると、セキュリティ機能の制約はAppleScriptにも及ぶようになり、デフォルトの状態では各種機能を動作できない設定状態でOSがリリースされるようになりました。

AppleScriptからmacOSのフル機能を利用するためには、各種セキュリティ機能の解除を行う必要があるわけです。AppleScriptからアプリケーションを操作しようとすると、「プライバシーとセキュリティ」>「オートメーション」などで実行側のプログラム(AppleScriptアプレットなど)に対して実行許可が必要です。

この解除方法を知らなければ、AppleScriptの制限解除が行えないわけで、「Scriptが動かなくなった!」「Scriptが壊れた!」と騒いでいる人を見かけますが、ほとんどがこれです。そして、Appleがこうした説明をしないため、知識や情報を持たない人はOSの機能を十分に発揮させられません。macOSの足枷を外して、本来のパワーを取り戻すための1冊です。もちろん、危険なことには手を出しません。

目次

macOSのセキュリテイ機能とAppleScriptの制限解除

初期状態のままだと最新の環境でASが動かない
macOSのバージョンとセキュリティ機能の変化
macOS 12までの「セキュリティとプライバシー」
macOS 13からの「プライバシーとセキュリティ」
①アクセシビリティ
②フルディスクアクセス
③ファイルとフォルダ
④オートメーション
オートメーションの認証状態を取得
アクセシビリティの認証状態をScriptで確認

AppleScriptの実行プログラム=ランタイム環境を確認

AppleScriptアプレットを実行する場合には
実行環境1:スクリプトエディタ
実行環境2:スクリプトメニュー
実行環境3:Automator
実行環境4:ショートカット.app
実行環境5:/usr/bin/osascript
AppleScript 各ランタイム環境情報(1/2)
AppleScript 各ランタイム環境情報(2/2)

その他のセキュリティ関連設定

Image Eventsが使えない!
ドロップレットでファイルを受信できない!
Safari でAppleScriptのコマンドがエラーに!
Safari 10以降のdo JavaScript設定

Posted in Books Security | Tagged 12.0savvy 13.0savvy | Leave a comment

AppleScript disassembler

Posted on 1月 23, 2021 by Takaaki Naganoya

Twitterで一時期さんざん騒がれていた(一部のアカウントが情報を拡散していた)、AppleScript Disasemblerについて調べてみました。

いわく、

「Macには5年前からウィルス(マイニングツール?)が出回っている。というのも、実行専用のAppleScript appletはAppleのウィルスチェックの対象から外れており、中身を確認できないからである。この脅威に対処するためのツールはXXに問い合わせるとよい。aevt disassemblerなどのツールを用意している」

という内容のものでした。分かりやすい恫喝です。「5年前からウィルスが」云々の是非は知りませんし、それにAppleScriptが使われているのかどうかなども知りません。見たことがないものについては、批評も判断も不可能です。

実行専用のAppleScript AppletだとAppleのチェックを免れる、という点については疑問が残ります。ただ、仮にそうしたものがあったとして、その実行内容をいちいちOS側がチェックしているとも考えにくいので、その可能性は否定できません。

そして、「aevt disassemblerなどのツール」という点、ここが問題です。本当にできるのか? 冗談ツールみたいなもの(特定条件では使えるが実用性がない)はあるのかもしれませんが、そんなに、現代の高度化しているAppleScriptのプログラムの内容を、実行専用バイナリから元ソース取り出しができるものなのか?????? これは、試してみないとなんとも言えません。

えーーー、AppleScriptはAppleEventのバイトコードに翻訳されて実行されます。

この、AppleEventのバイトコードから元のAppleScriptを戻せるかどうかについては、かなり初期から「イベントのコードと実際のAppleScriptの対処表を作れば、元のコードを取り出すことは原理上不可能ではないだろう」という推測が行われてきました。

ただ、その対処表を作るという手間がバカバカしく、苦労の割に得るものが少ないため誰も本気で取り組んでこなかったテーマでもあります。

とりあえず実行専用のAppleScriptでなければ「osadecompile」コマンドがOSに標準装備されているので、これでソースを取得することは可能です。

では、実行専用のAppleScriptやAppletからソースを取得できるのでしょうか?

Github上でそれらしきソフトウェアをみつけました。aevt_decompileとapplescript-disassemblerです。それぞれ実際に試してみました。

確認対象ファイルは、

①普通の(スクリプトエディタで)読める通常形式のAppleScript(.scpt)
②「実行専用」の通常形式のAppleScript(.scpt)
③「実行専用」のAppleScriptアプレット
④「実行専用」のAppleScriptアプレット(コード署名つき)

の4つです。主に、decompilerについて(確認もしないで)騒いでいる連中が槍玉に挙げているのは、③④のはずなので、①②はあくまで比較用です。

aevt_decompile

まず、aevt_decompileを実際にXcode上でビルドし、/usr/local/binにコピーしたうえでTerminal上から実行してみました。

Mac:bin me$ ./aevt_decompile /Users/me/Desktop/copy\ files\ to\ target\ folder.app 
2021-01-23 20:39:21.622 aevt_decompile[10457:2398389] The file “copy files to target folder” couldn’t be opened because you don’t have permission to view it.
Mac:bin me$ ./aevt_decompile /Users/me/Desktop/copy\ files\ to\ target\ folder.app/Contents/Resources/Scripts/main.scpt 
2021-01-23 20:39:55.375 aevt_decompile[10469:2400520] The file “main.scpt” couldn’t be opened using text encoding Unicode (UTF-8).
Mac:bin me$ ./aevt_decompile /Users/me/Desktop/copy\ files\ to\ target\ folder_no_sign.app/Contents/Resources/Scripts/main.scpt 
2021-01-23 20:41:02.693 aevt_decompile[10482:2405472] The file “main.scpt” couldn’t be opened using text encoding Unicode (UTF-8).
Mac:bin me$ ./aevt_decompile /Users/me/Desktop/copy\ files\ to\ target\ folder.scpt 
2021-01-23 20:41:47.007 aevt_decompile[10488:2407982] The file “copy files to target folder.scpt” couldn’t be opened using text encoding Unicode (UTF-8).

結果は、ことごとく「couldn’t be opened」でデスクトップフォルダ上に置いた①〜④のScriptをオープンできませんでした。

applescript-disassembler

Pythonで書かれたこのツールは実行権限を与えるだけで簡単に動きました。また、①〜④のファイルに対してアクセスすることができました。

こちらは結果が出てきました。かなり膨大な内容です。オリジナルのAppleScriptが、

set fileTexts to paragraphs of (the clipboard)

set chkFol to choose folder with prompt "[From] Select Check folder"
set moveTargFol to choose folder with prompt "[To] Select Copy Trget folder"

repeat with i in fileTexts
	set j to contents of i
	set fromPath to (chkFol as string) & j
	try
		tell application "Finder"
			duplicate file fromPath to moveTargFol
		end tell
	end try
end repeat

の程度のひじょうに簡単なものであったのですが、実際に出力されたのは、

# 注:HTMLタグと間違えられてしまう<>については全角記号に置き換えました

--Applet without Code Sign③

Mac:applescript-disassembler-master me$ ./disassembler.py /Users/me/Desktop/copy\ files\ to\ target\ folder_no_sign.app/Contents/Resources/Scripts/main.scpt 
=== data offset 2 ===
Function name : <Value type=object value=<Value type=event_identifier value=b'aevt'-b'oapp'-b'null'-b'\x00\x00\x80\x00'-b'****'-b'\x00\x00\x90\x00'>>
Function arguments:  <empty or unknown>
 00000 PushIt 
 00001 Push0 
 00002 MessageSend 0 # <Value type=object value=<Value type=event_identifier value=b'Jons'-b'gClp'-b'****'-b'\x00\x00\x00\x00'-b'null'-b'\xff\xff\x80\x00'>> 
 00005 PushLiteral 1 # <Value type=object value=<Value type=constant value=0x63706172>> 
 00006 MakeObjectAlias 22 # GetEvery

 00007 GetData 
 00008 PopGlobal b'fileTexts' 
 00009 StoreResult 
 0000a PushIt 
 0000b PushLiteral 3 # <Value type=object value=<Value type=constant value=0x70726d70>> 
 0000c PushLiteral 4 # [<Value type=special value=nil>, <Value type=string value=b'\x00[\x00F\x00r\x00o\x00m\x00]\x00 \x00S\x00e\x00l\x00e\x00c\x00t\x00 \x00C\x00h\x00e\x00c\x00k\x00 \x00f\x00o\x00l\x00d\x00e\x00r'>] 
 0000d Push2 
 0000e MessageSend 5 # <Value type=object value=<Value type=event_identifier value=b'syso'-b'stfl'-b'alis'-b'\x00\x00\x00\x00'-b'null'-b'\xff\xff\x80\x00'>> 
 00011 GetData 
 00012 PopGlobal b'chkFol' 
 00013 StoreResult 
 00014 PushIt 
 00015 PushLiteral 3 # <Value type=object value=<Value type=constant value=0x70726d70>> 
 00016 PushLiteral 7 # [<Value type=special value=nil>, <Value type=string value=b'\x00[\x00T\x00o\x00]\x00 \x00S\x00e\x00l\x00e\x00c\x00t\x00 \x00C\x00o\x00p\x00y\x00 \x00T\x00r\x00g\x00e\x00t\x00 \x00f\x00o\x00l\x00d\x00e\x00r'>] 
 00017 Push2 
 00018 MessageSend 5 # <Value type=object value=<Value type=event_identifier value=b'syso'-b'stfl'-b'alis'-b'\x00\x00\x00\x00'-b'null'-b'\xff\xff\x80\x00'>> 
 0001b GetData 
 0001c PopGlobal b'moveTargFol' 
 0001d StoreResult 
 0001e LinkRepeat 0x64

 00021 PushGlobal b'fileTexts' 
 00022 Dup 
 00023 PushLiteral 9 # <Value type=object value=<Value type=constant value=0x6b6f636c>> 
 00024 PushLiteral 10 # <Value type=object value=<Value type=constant value=0x636f626a>> 
 00025 Push2 
 00026 MessageSend 11 # <Value type=object value=<Value type=event_identifier value=b'core'-b'cnte'-b'****'-b'\x00\x00\x00\x00'-b'****'-b'\x00\x00\x10\x00'>> 
 00029 Push1 
 0002a PushUndefined 
 0002b RepeatInCollection <disassembler not implemented> 
 0002c Equal 
 0002d Equal 
 0002e PushVariable [var_0] 
 0002f PushLiteral 12 # <Value type=object value=<Value type=constant value=0x70636e74>> 
 00030 MakeObjectAlias 21 # GetProperty

 00031 GetData 
 00032 PopGlobal b'j' 
 00033 StoreResult 
 00034 PushGlobal b'chkFol' 
 00035 PushLiteral 14 # <Value type=object value=<Value type=constant value=0x54455854>> 
 00036 Coerce 
 00037 PushGlobal b'j' 
 00038 Concatenate 
 00039 GetData 
 0003a PopGlobal b'fromPath' 
 0003b StoreResult 
 0003c ErrorHandler 87 
     0003f PushLiteralExtended 16 # <Descriptor type=b'alis' content=b'\x00\x00\x00\x00\x014\x00\x02\x00\x01\x06Cherry\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00BD\x00\x01\xff\xff\xff\xff\nFinder.app\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\n cu\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0cCoreServices\x00\x02\x00)/:System:Library:CoreServices:Finder.app/\x00\x00\x0e\x00\x16\x00\n\x00F\x00i\x00n\x00d\x00e\x00r\x00.\x00a\x00p\x00p\x00\x0f\x00\x0e\x00\x06\x00C\x00h\x00e\x00r\x00r\x00y\x00\x12\x00&System/Library/CoreServices/Finder.app\x00\x13\x00\x01/\x00\xff\xff\x00\x00'> 
     00042 Tell 16 
         00045 PushIt 
         00046 PushLiteralExtended 17 # <Value type=object value=<Value type=constant value=0x66696c65>> 
         00049 PushGlobal b'fromPath' 
         0004a MakeObjectAlias 24 # GetIndexed (item A of B)

         0004b PushLiteralExtended 18 # <Value type=object value=<Value type=constant value=0x696e7368>> 
         0004e PushGlobal b'moveTargFol' 
         0004f Push2 
         00050 MessageSend 19 # <Value type=object value=<Value type=event_identifier value=b'core'-b'clon'-b'****'-b'\x00\x00\x00\x00'-b'****'-b'\x00\x00\x90\x00'>> 
         00053 EndTell 
     00054 EndErrorHandler 93 
 00057 HandleError 20 21 
 0005c PushUndefined 
 0005d Dup 
 0005e StoreResult 
 0005f Jump 0x2b 
 00062 Return 

のような、膨大な内容です。まるで、アセンブラのニーモニックを読んでいるかのような感覚です。

10行程度のScriptから14倍の内容が出力されています。一応、一部の処理内容については(エラートラップ部分など)推測することは可能ですが、前半部分はさっぱりです。断片的に変数名などがわかったり、後半のインデント構造的なものが見えたりするあたりはソースのように見えなくもありませんが、この出力から元のAppleScriptの内容を理解できたりするのでしょうか?

もしかすると、Classic Mac OSの開発経験があるとこの内容を「読む」ことが可能なのかもしれませんが、この内容では自分にはさっぱり分かりません。

現状では、AppleEventを人間が読んでも理解できそうな命令語に置き換え、パラメータともども一覧表示しているというものに見えます。そのレベルの機能については間違いなく実現しているでしょう。ただ、そのAppleEventニーモニックの展開ができたからといって、元のAppleScriptのプログラムを復元できるようには見えません。

# じっと眺めていると「スタック操作を頻繁に行っている」ように見えますが、それでもそれ以上の情報は読み取れません

applescript-disassemblerの機能は同梱のドキュメントのとおりで、実行専用のアプレットから元のAppleScriptのプログラムソースが得られるといったものではありませんでした。その動作内容についても確認できましたし、処理レベルも確認できました。

自分が行った検証のかぎりでは(検証前からおぼろげにわかっていましたが)、一部の人間が他の多くのユーザーの警戒心を煽っているような状況では「ない」と思います。おそらく、その解決ツールという名目でそれらしい動作を行うツールを(AppleScriptを読めない顧客に)売りつけ、お金を巻き上げようという魂胆なのでしょう。

Posted in news Security | Tagged 10.14savvy 10.15savvy 11.0savvy | Leave a comment

PermissionsKitでユーザー権限のチェックとリクエスト(フルディスクアクセス)

Posted on 12月 19, 2019 by Takaaki Naganoya

PermissionsKit.frameworkの機能を呼び出して、実行中のアプリケーションがフルディスクアクセスの権限を持っているかどうか確認を行い、持っていなかった場合には権限を許可してもらえることを願ってシステム環境設定の「セキュリティとプライバシー」>「セキュリティ」を表示します。

–> Download PermissionsKit_tester(Code-Signed Executable Applet with Framework in its bundle)

だいたいはサンプルのObjective-CのプログラムをAppleScriptに翻訳して実行しているだけですが、1箇所だけ発見がありました。

ご存知のとおりBlocks構文はAppleScriptでは書けないので、Blocks構文の記述が要求されるAPIはAppleScriptから呼び出せません。

本FrameworkのAPIも権限を要求するときにBlocks構文の記述が求められるのですが、ためしにBlocks(^)の記述を要求される箇所にヌルを指定してみたところ、、、、動きました(^ー^;;;;;;

# なんでも効くわけではないようです

あー、Blocks構文のところにヌルを指定すると動くんだー。処理終了時に実行する内容をBlocksの中に書くのを、何も書かないことで同期実行とほぼ同じ扱いができるんじゃないかと。いろいろ試してみると発見があるかもしれません。

# 今日、Edama2さんと世間話していたら「パラメータとしてBlocks構文を必要とされる箇所にmissing valueを入れて動いたケースもあったよ」とのこと。そういうの重要なので教えてほしかったー(T_T)

PermissionsKit.frameworkでは各種権限設定の確認と要求が行えるようにはなっているのですが、フルディスクアクセス以外はすべてクラッシュして動かなかったので、フルディスクアクセスの権限確認&要求専用とみなしています。

AppleScript名:PermissionsKitでユーザー権限のチェックとリクエスト(フルディスクアクセス).scptd
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/12/19
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use framework "PermissionsKit" –https://github.com/MacPaw/PermissionsKit
use scripting additions

property MPPermissionTypeCalendar : 0
property MPPermissionTypeReminders : 1
property MPPermissionTypeContacts : 2
property MPPermissionTypePhotos : 3
property MPPermissionTypeFullDiskAccess : 4

–MPPermissionTypeFullDiskAccess 以外はクラッシュして処理継続できなかった

set aPerm to current application’s MPPermissionsKit’s alloc()’s init()
set pRes to current application’s MPPermissionsKit’s authorizationStatusForPermissionType:(MPPermissionTypeFullDiskAccess)

set sRes to getStatus(pRes) of me
log sRes

if pRes is not equal to 0 then
  set pRes to current application’s MPPermissionsKit’s requestAuthorizationForPermissionType:(MPPermissionTypeFullDiskAccess) withCompletion:""
end if

on getStatus(aFlag)
  if aFlag = 0 then
    return "Denied" –拒否された
  else if aFlag = 1 then
    return "Authorized" –承認ずみ
  else if aFlag = 2 then
    return "Not determined" –未定
  end if
end getStatus

★Click Here to Open This Script 

Posted in Security | Tagged 10.13savvy 10.14savvy 10.15savvy | Leave a comment

macOS標準装備のAppleScript専用補助アプリケーション「Image Events」がデフォルトではファイルにアクセスできない設定に

Posted on 12月 1, 2019 by Takaaki Naganoya

macOSには、GUIをもたないAppleScript専用の補助アプリケーションが標準装備されていますが、macOS 10.15になって正常に(期待通りに)動作しない状態でリリースされているので注意が必要というお話です。

macOSには、「●●Scripting」といったClassic Mac OSから引き継いだツール群と、「●●Events」といったMac OS X移行時に搭載されたAppleScriptからの呼び出し専用のツール群が、/System/Library/CoreServicesフォルダに入っています。

  10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14 10.15 11.0
ColorSyncScripting ⬛︎ ⬛︎            
Database Events ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎
Digital Hub Scripting ⬛︎ ⬛︎            
FontSync Scripting ⬛︎ ⬛︎            
Image Events ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ★ ★
Keychain Scripting ⬛︎ ⬛︎ ⬛︎          
System Events ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎ ⬛︎
URL Access Scripting ⬛︎ ⬛︎ ⬛︎          

▲「最新事情がわかるAppleScript 10大最新技術 Ver.2.0」より抜粋(36ページ掲載)、最新OSに合わせて改定

最新版のmacOS 10.15でもSystem Events、Image Events、Database Eventsの3つが残っており、System Eventsはよく使われています。

Image Eventsはごくまれに、Database Eventsに至ってはほぼ実戦で利用したことがありませんが、存在していることは確認しています。

そんなImage Eventsが、macOS 10.15上でデフォルト設定ではユーザー指定の画像ファイルにアクセスできなくなっていることが確認されています。

システム環境設定の「セキュリティとプライバシー」>「セキュリティ」>「フルディスクアクセス」にImage Eventsを登録すればアクセスできるようにはなりますが、「セキュリティ強化」の美名のもとに機能の自家中毒を起こしている状態といえるでしょう。

一方、Database Eventsではそんなことはなく、Database Events経由で作成したデータベースに問題なくアクセスできますし、Database Eventsの唯一にして最大の機能である「AppleScriptのフィルタ参照でデータベースのしぼりこみ検索を行う」機能も健在です(それしかできないので)。

AppleScriptによる画像処理は、ICCプロファイルを重視してAdobe Photoshopで行うか、RGB画像をスピーディーにCocoa Frameworkで処理するかの方向に二分されており、Image Eventsで行うような基礎的な画像処理はCocoa Frameworkで肩代わりされる方向にあります。Image Eventsは入門者向けのなんちゃって画像処理レベルで用いられるものであり、個人的にはほとんど利用していません。事情を知らない入門者がハマる落とし穴が新しく1つ作られたといったところでしょうか。


▲openコマンドの引数はfile(実際にはalias)と書かれているが、furlで渡さないとオープンされないImage Events


▲SQLiteラッパーで、素朴すぎて機能がまったく不明だったDatabase Events。まさかフィルタ参照で絞り込みを行う専用ツールだったとは(ソート命令も検索命令もない謎仕様)

Posted in Bug Security | Tagged 10.15savvy Database Events Image Events | 2 Comments

macOS 10.14.5

Posted on 5月 14, 2019 by Takaaki Naganoya

■和暦の「令和」対応

macOSでは10.14.5にアップデートしないと「令和」表示にならないもよう。ただし、和暦は日常的には(個人的に)ほとんど使っていないので影響はあるんだかないんだかわかりません。

■Notarized Service

macOS 10.14.5より、Kernel Extension/アプリケーションについては、distribute(Mac App Store経由の配布を意図しているものと思われる)にはNotarize(公証)サービスをパスすることが要求されるようになりました。

コード署名:ビルド時、およびアプリケーション書き出し時にApple開発アカウントの署名(開発者IDによる署名)を行う
Sandbox:Mac App Storeに提出するアプリケーションにおいて、Sandbox環境を前提としたランタイム環境で実行する(Xcodeのみ)
Notarize(公証):実行バイナリの内容にコンピュータに対して害をなすような処理内容が含まれていないか、AppleのNotarizedサービスを呼び出すことで自動的に検証・証明される

コード署名以上、Mac App Storeへのアプリ審査以下、という説明をされていますが、Sandboxが前提とかいうのは無茶な気がします。

macOS 10.15上でも、さらにNotarize(公証)サービスと連携した機能が提供されることでしょう。

現時点において、自分が自分のMac上でAppleScriptで作成したアプリケーションについて、公証サービスを通しておく必要はありません。ただし、Webを通じて不特定多数に対してアプレット/アプリケーションを配布するとか、仕事で実行バイナリを納品するような場合には必要になるかもしれません。少なくとも、Mac App Store上でAppleScriptによって記述したアプリケーションを配布する場合には必要になってきます。

ただ、あのAppleの公証サービスが本当にコンピュータに有害な処理を検出できるのか? 誤って有害ではない処理を有害判定するのではないか、という疑問はついて回ります(かのmacOS 10.13をリリースさせたTim Cook体制のやることなんて信用できない)。Sandboxで禁止されている処理ぐらいは、かんたんに回避して実行できましたし。

誤って「有害な処理を行なっている」と判定されたアプリケーションの異議申し立てや、誤って有害判定されたDevelopper IDをAppleが機械的に無効化したり、Bannするような間抜けな事態の発生が予想できすぎです(Developper向けのMailing Listが落ちて、連絡しても1か月放置するような会社にそんなものを運用する能力があるのでしょうか?)。

自分でビルドしてコード署名してNotarizedしたFrameworkぐらいは自分のホームディレクトリ下に置いて呼び出したいところです。macOS 10.14のSIPによる制限は非常にかったるくて生産性が下がります。あるいは、スクリプトエディタからもっとシステムよりのFrameworksフォルダに入れたフレームワークを呼び出せるようにするとか。

なお、Shane Stanley@Late Night Softwareが、このNotarizeサービスにアプリケーションを認証するツールを用意し、配布しています(なんとスクリプタブル!)。この、考えただけで憂鬱になるNotarizeサービスにアプリケーションを通す作業も、自動で行うことで不快感が軽減されるかもしれません。

SD NOTARY: NOTARIZING MADE EASY

SD Notary: Notarizing Made Easy

Posted in Notarization Security | Tagged 10.14savvy | Leave a comment

Xcode 10.1+macOS MojaveでGUIアプリケーションを作成

Posted on 1月 16, 2019 by Takaaki Naganoya

Apple Developper Accountの契約を行い、Xcode上で(他のアプリケーションをコントロールする)AppleScriptアプリケーションを作れるようにしたときに、macOS 10.14+Xcode最新版の10.1だと実際どうなのかをまとめてみました。

Xcode上でこれまでと同様にScriptアプリケーションを記述しただけではダメ

Sandbox対応させると制約事項が増えるため、Sandbox非対応のアプリケーションをビルドしてどこまで行けるかは興味深いところです。

ですが、とりあえず(安全のために)、Code Sign+Sandboxの設定を行ってXcode上でAppleScriptアプリケーションを作成。Keynoteに新規ドキュメントを作成させる程度のお気軽なコードを書き、ビルドして実行。すると、

2019-01-15 99:99:99.999999+0900 1014test[13673:1813575] *** -[AppDelegate applicationWillFinishLaunching:]: Not authorized to send Apple events to Keynote. (error -1743)

などとエラーが出るだけで、AppleScriptからの操作対象アプリケーション(ここではNumbers)は、動かせませんでした。Automationのセキュリティダイアログ自体が表示されない状態です。


▲セキュリティダイアログはこんなやつ

Info.plistにエントリを追加するとSecurityダイアログが表示されるようになる

こういう場合には海外のサイトを調べてみるのが一番手っ取り早いところです。いろいろ調べてみたところ、Info.plistに対して、

Privacy - AppleEvents Sending Usage Description

というエントリを追加する必要があるとのこと。

このInfo.plist上のエントリ、例のMojaveから出るようになったSecurityダイアログにアプリケーション側から出力するカスタムメッセージを定義するエントリのようです。エントリさえ存在すれば、とくに何か気の利いたメッセージを入れる必要はないようです。

英語で書いても、日本語で書いてもそのままダイアログに出力されます。Info.plistの内容自体はローカライズできないので、本エントリの内容は広域に配布するものであれば英語で、特定の日本国内の顧客に向けて納品するものであれば日本語で書けばいいんじゃないでしょうか(一般的なメッセージ同様にローカライズできることが望ましい)。このあたり、ローカライズできないのは仕様的におかしいので、そのうち仕様が変わりそうです、、、、

Securityダイアログを表示させるためには、AppleScriptアプリケーション側から対象のアプリケーションに対して命令を発行する必要があるのですが、これが、activateさせるとかバージョン番号を調べるぐらいのコマンドではそのまま実行されてしまって、セキュリティダイアログは表示されません。

せめて新規ドキュメントを作成(make new document)して破棄(close without saving)するぐらいのことを行わないと、ダメなようです。このあたり、実際に試してみるしかないようです。

■セキュリティダイアログを表示させる程度の意味のない(ウォームアップのための)Scriptサンプル

tell application "Microsoft Excel"
  set aDoc to (make new document)
  
close active workbook without saving
end tell

★Click Here to Open This Script 

tell application "Keynote"
  set aDoc to (make new document)
  
close aDoc without saving
end tell

★Click Here to Open This Script 

tell application "Finder"
  make new Finder window
  
close Finder window 1
end tell

★Click Here to Open This Script 

–Touch Barの有無の検出
on detectTouchBar()
  tell application "System Events"
    set frontApp to first application process whose frontmost is true
    
try
      set touchBar to first UI element of frontApp whose role is "AXFunctionRowTopLevelElement"
    on error errMsg number errNum
      return false
    end try
    
    
set touchBarItems to value of attribute "AXChildren" of touchBar
    
return (touchBarItems is not equal to {})
  end tell
end detectTouchBar

★Click Here to Open This Script 

対象アプリケーションに対してコマンドを実行し、Securityダイアログが表示され、ユーザーによってきちんと認証されれば、tccKitを用いて認証状況を確認して、すべてのアプリケーションの認証完了状態をAppleScriptから知ることができます。

AppleScriptアプリケーションの冒頭(applicationWillFinishLaunchingイベントハンドラなど)でtccKitによって認証状態をチェックし、未認証の状態であれば操作対象のアプリケーションに対して試験的にコマンドを実行するようにすればよいでしょう。

AppleScriptアプリケーションがCode Signされていれば、セキュリティ認証ダイアログでユーザー認証する必要があるのは初回のみです。現在、Xcode上でGUIアプリケーションをビルドするためにはApple Developper Accountが必須となっているため、この点は必然的にクリアされることになります。

なお、この認証フローにおいてアプリケーション自体がSandbox化されている必要はありません(確認ずみ)。

Posted in AppleScript Application on Xcode GUI Security | Tagged 10.14savvy | 2 Comments

tccKitで指定Bundle IDのアプリケーションの「オートメーション」認証状況を取得

Posted on 11月 19, 2018 by Takaaki Naganoya

システム環境設定の「セキュリティとプライバシー」>「セキュリテイ」>「オートメーション」項目に指定Bundle IDのアプリケーションが登録されているかどうかをチェックするAppleScriptです。

macOS 10.14, Mojaveの機能を利用しているため、macOS 10.14以降を必要とします。また、実行にはScript Debugger上で動かすか、本ScriptをAppleScriptアプレットに保存して結果を別の方法で出力する必要があります(ファイルに書き出すとか、他のテキストエディタなどの新規ドキュメント上に書き込むとか、display notificationコマンドでノーティフィケーション表示するとか)。

プログラムの本体は「Hal Mueller’s Blog」の2018年9月4日掲載記事「Privacy Consent in Mojave (part 2: AppleScript)」内のObjective-CのプログラムをCocoa Framework化した「tccKit」です。

#2023/2/8 Update Universal Binaryでビルド
–> Download tccKit.framework (To ~/Library/Frameworks)

–> Download tccKit source (Xcode 10.1 Project)

掲載Sample Scriptのように、結果は文字列(NSString)で返ってきます。

上記のような「セキュリティ」の状況で実行したところ、

 Keynote:”PrivacyConsentStateGranted”(認証ずみ)
 CotEditor:”PrivacyConsentStateUnknown”(不明、実際には未認証)
 Mail:”PrivacyConsentStateUnknown”(不明、実際には未認証)

のような結果が得られました。

Objective-Cのプログラム側では、PrivacyConsentStateUnknown / PrivacyConsentStateGranted / PrivacyConsentStateDenied の3つの状態を返すようになっています。”PrivacyConsentStateGranted”のみユーザーの認証が得られている、と見てよいのでしょう。

もしも、PrivacyConsentStateDenied(ユーザーがダイアログで「許可しない」ボタンを押した)という状況であれば、シェルの/usr/bin/tccutilコマンドで状態をクリアし(do shell script ”tccutil reset com.apple.Terminal” とか)、再度、ユーザーの認証を取得する(activateなど簡単なコマンドを実行)とよいでしょう。
→ 実際には、activateやpropertyを取得する程度だとOSのオートメーション認証が反応せず、ドキュメントを新規作成するぐらいのことをやる必要があります。じゃあドキュメントを作らないタイプのアプリケーションだとどうなんだという話がありますが、それはひととおり試してみるしかなさそうです

ただ、本Frameworkは本当に単純にHal Mueller’s Blogの記述サンプルをコピペで(ちょっと改変して)呼び出して動かしているだけなので、起動中のアプリケーションのBundle Identifierをすべて取得してループでチェック、といった処理を行うと、なぜか結果が返ってきません(Script Debuggerがハングアップ)。連続で呼び出すのがよくないのか、チェック用のAPIに癖があるのかわかりませんが、現状でわかっている問題点として記載しておきます。

–> いろいろ調査してみたら、Code Signされていないアプリケーション(例:Skim)のチェックを行うとハングアップするようです。スクリプタブルではないアプリケーションのBundle IDを渡しても、ハングアップは起こりません

CAUTION: AEDeterminePermissionToAutomateTarget hangs up with unsigned application such as Skim PDF reader

macOS 10.14上で開発を行う場合には心の底から必要な処理だと思うので、本Frameworkはもうちょっとブラッシュアップしたい気持ちでいっぱいです。macOS 10.13が前代未聞・空前絶後のダメダメさだったので(Tim Cookもう勘弁して)、10.14には期待しているんですよ本当に(文句もいっぱい言ってるけど)。

AppleScript名:tccKitでBundle IDで指定したアプリケーションのtcc状況を取得.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2018/11/19
—
–  Copyright © 2018 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.7" — Mojave (10.14) or later
use framework "Foundation"
use framework "tccKit" –https://halmueller.wordpress.com/2018/09/04/privacy-consent-in-mojave-part-2-applescript/
use scripting additions

set tccCheker to current application’s tccCheck’s alloc()’s init()

set aBundle to "com.apple.iWork.Keynote"
set aRes to (tccCheker’s automationConsentForBundleIdentifier:aBundle promptIfNeeded:false) as string
log aRes
–> "PrivacyConsentStateGranted"

set bBundle to "com.coteditor.CotEditor"
set bRes to (tccCheker’s automationConsentForBundleIdentifier:bBundle promptIfNeeded:false) as string
log bRes
–> "PrivacyConsentStateUnknown"

set cBundle to "com.apple.mail"
set cRes to (tccCheker’s automationConsentForBundleIdentifier:cBundle promptIfNeeded:false) as string
log cRes
–> "PrivacyConsentStateUnknown"

★Click Here to Open This Script 

Posted in Sandbox Security | Tagged 10.14savvy | 3 Comments

OS X 10.11.5+Safari 9.1.1以降で、新たなAS制限機能が増える

Posted on 5月 24, 2018 by Takaaki Naganoya

macOS 10.11.5+Safari 9.1.1以降で、新たなAppleScriptの制限機能が増えました。Safariに対してdo javascriptコマンドによるコマンド実行が可能でしたが、これがデフォルト設定では禁止状態になったということです。

macOS 10.12.x系では、macOS 10.12.6+Safari 11.1にて、macOS 10.13.x系ではmacOS 10.13.5+Safari 11.1.1上にて確認しています。

■デフォルトでdo javascriptコマンドによる制御がオフに

これ以前のmacOSではデフォルトでオンになっていたので、一回オンにする作業が必要になりました(管理者パスワード必要)。

・STEP1 「開発」メニューをオンに
Safariの「環境設定」>「詳細」で、「メニューバーに”開発”メニューを表示」をオンにします。これで、Safariのメニューバーに「開発」メニューが表示されます。

・STEP2 「開発」メニューから「AppleEventからのJavaScriptを許可」「スマート検索フィールドからのJavaScriptを許可」の2つの項目をオンに(管理者パスワード必要)

AppleScript名:最前面のウィンドウのタイトルを取得する
tell application "Safari"
  set aRes to do JavaScript "document.title;" in front document
  
display dialog aRes
end tell

★Click Here to Open This Script 


▲デフォルト状態


▲「開発」メニューからJavaScriptの実行を許可した状態

Posted in JavaScript Security | Tagged 10.11savvy 10.12savvy 10.13savvy Safari | Leave a comment

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • macOS 13.6.5 AS系のバグ、一切直らず
  • Apple純正マウス、キーボードのバッテリー残量取得
  • PowerPoint書類の各スライドのタイトルを取得
  • 指定画像をbase64エンコード文字列に変換→デコード
  • CotEditorで2つの書類の行単位での差分検出
  • macOS 14の変更がmacOS 13にも反映
  • Finder上で選択中のPDFのページ数を加算
  • Cocoa-AppleScript Appletランタイムが動かない?
  • ディスプレイをスリープ状態にして処理続行
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • macOS 13 TTS環境の変化について
  • 当分、macOS 14へのアップデートを見送ります
  • macOS 14、英語環境で12時間表記文字と時刻の間に不可視スペースを入れる仕様に
  • HammerspoonでLuaを実行
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • 新刊発売 AppleScript最新リファレンス v2.8対応
  • 初心者がつまづきやすい「log」コマンド
  • PowerPointで最前面の書類をPDF書き出し
  • macOS 14, Sonoma 9月27日にリリース

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1390) 10.14savvy (586) 10.15savvy (435) 11.0savvy (279) 12.0savvy (199) 13.0savvy (107) 14.0savvy (52) CotEditor (62) Finder (48) iTunes (19) Keynote (105) NSAlert (60) NSArray (51) NSBezierPath (18) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (51) NSDictionary (27) NSFileManager (23) NSFont (18) NSImage (41) NSJSONSerialization (21) NSMutableArray (62) NSMutableDictionary (21) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (117) NSURL (97) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (59) Pages (44) Safari (43) Script Editor (23) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • Clipboard
  • Code Sign
  • Color
  • Custom Class
  • dialog
  • diff
  • drive
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC