Dienstag, 20. August 2019

Revolut-Transaktionen als PDF oder Excel exportieren

Ferienzeit heisst bei mir seit Januar 2019 massiver Einsatz von Revolut. Ich hoffe, dass die Abzocker Swisscard & Co. in diesem Sommer zum ersten Mal richtig zu spüren bekommen, dass die Leute nicht mehr gewillt sind, 2.5% Auslandstransaktionskosten zu bezahlen. Winke winke mit dem Zaunpfahl!

Doch wer im Ausland nur noch mit Revolut bezahlt und gleichzeitig eine Buchhaltung pflegt, der weiss, dass man nun noch einen weiteren Zahlungskanal berücksichtigen und erfassen muss.

Bis vor Kurzem war ich der Meinung, dass es keine gescheite Möglichkeit gibt, Revolut-Transaktionen in ein standardisiertes Datenformat zu exportieren. Ein Arbeitskollege überzeugte mich dann erfreulicherweise vom Gegenteil.

Der Export der Transaktionen ist ganz simpel, erfolgt in der App und der Dateitransfer erfolgt per E-Mail oder einer anderen Applikation, die im iOS Sharing-Dialog erscheint.

Nicht nur ist der Export im PDF-Format möglich, sondern auch als Excel — d.h. einer manuellen oder automatisierten Weiterverarbeitung steht nichts im Weg. Und es kommt noch besser: Man kann Start- und Endedatum der Transaktionen monatsweise selektieren.

So gelangt man zum Screen:

  • Revolut starten
  • Home Screen
  • Gewünschtes Konto auswählen
  • Details
  • Statement
  • Dateityp wählen: [PDF | Excel]
  • Start- und Endemonat wählen
  • Get statement anwählen
  • Sharing Button betätigen
  • E-Mail auswählen
  • Empfänger eingeben
  • Senden

Hier die Bildschirmfotos dazu:

image-8512

image-8513

image-8514

Tags:
Labels: Shopping

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 15. August 2019

tenpaycert.exe – Dubious WeChat Pay browser plugin with possible local server component TenpayServer.exe

(This article is posted in English because I have a gut feeling this information is relevant to the global Information Security Community)

If you are a merchant accepting WeChat Pay payments from your customers, WeChat Pay seems to offer you a web-based administration interface which you can access with the following URL:

pay.weixin.qq.com/index.php/public/wechatpay/home

I recently got notified that a merchant seems not to be able to log into this interface using proper credentials. Instead, the following error message is presented to him:

Such as password entry exception, please follow the guidelines to modify the browser configuration, see guidelines.

The guidelines do explain that to access the web interface, the user needs to install a browser plugin:

After you enter your merchant ID, you will be prompted to download and install the security controls. Click the box outlined in red in the image below.

It is called „tenpaycert.exe“ and can be downloaded from the following URL:

www.tenpay.com/download/tenpaycert.exe

The file is 16607016 bytes in size (ca. 15MB) and at the time of writing the file hash (MD5) was 5ae039d22906733d19ef21b17aca5539.

The exe file is a Win32 executable …

$ file tenpaycert.exe 
tenpaycert.exe: PE32 executable (GUI) Intel 80386, for MS Windows

… and with a closer analysis is actually a self-extracting ZIP archive. On macOS, I used Keka – the macOS file archiver to extract its contents into its original folder structure. The archive contains the following content:

$ tree -a
.
├── .data
├── .rdata
├── .reloc
├── .rsrc
│   ├── 1033
│   │   └── MANIFEST
│   │       └── 1
│   └── 2052
│       ├── ACCELERATOR
│       │   └── 109
│       ├── BITMAP
│       │   ├── 131.bmp
│       │   ├── 152.bmp
│       │   ├── 153.bmp
│       │   ├── 154.bmp
│       │   ├── 155.bmp
│       │   ├── 157.bmp
│       │   ├── 2001.bmp
│       │   ├── 2002.bmp
│       │   ├── 2003.bmp
│       │   ├── 2004.bmp
│       │   ├── 2005.bmp
│       │   ├── 2006.bmp
│       │   ├── 2007.bmp
│       │   ├── 2008.bmp
│       │   ├── 2009.bmp
│       │   ├── 2010.bmp
│       │   ├── 2011.bmp
│       │   └── 2012.bmp
│       ├── DIALOG
│       │   ├── 1001
│       │   ├── 148
│       │   ├── 149
│       │   ├── 150
│       │   └── 151
│       ├── GROUP_ICON
│       │   ├── 107
│       │   └── 108
│       ├── ICON
│       │   ├── 1.ico
│       │   ├── 10.ico
│       │   ├── 11.ico
│       │   ├── 12.ico
│       │   ├── 2.ico
│       │   ├── 3.ico
│       │   ├── 4.ico
│       │   ├── 5.ico
│       │   ├── 6.ico
│       │   ├── 7.ico
│       │   ├── 8.ico
│       │   └── 9.ico
│       ├── MSI
│       │   ├── 146
│       │   └── 147
│       ├── PNG
│       │   ├── 133
│       │   ├── 134
│       │   ├── 161
│       │   ├── 163
│       │   ├── 165
│       │   ├── 166
│       │   ├── 2022
│       │   ├── 2024
│       │   ├── 2025
│       │   ├── 2026
│       │   └── 2027
│       ├── string.txt
│       └── version.txt
├── .rsrc_1
├── .text
└── CERTIFICATE

Software

According to the file at .rscr > 2052 > version.txt, the official name of this software is „Tenpay Security Control“ and the current version number is 2.0.3.0

Certificate

The file CERTIFICATE (256296 bytes) in the root of the archive is interesting, but seems not to be a standardized format which file recognizes:

$ file CERTIFICATE 
CERTIFICATE: data

The timestamp of the file dates July 12, 2017 — seems to be a rather old certificate, assuming most of them do expire in two years max, nowadays.

Looking at it with the command strings and a Hex Editor (on macOS, I use Hex Fiend) reveals that at the very end of the file we can actually find strings which point to one or more embedded certificates:

Symantec Corporation1
Symantec Trust Network100.
Symantec Class 3 SHA256 Code Signing CA0
160128000000Z
190328235959Z0
Guangdong1
Shenzhen1503
Tencent Technology(Shenzhen) Company Limited1
Tencent Technology(Shenzhen) Company Limited0
http://sv.symcb.com/sv.crl0a
https://d.symcb.com/cps0%
https://d.symcb.com/rpa0
http://sv.symcd.com0&
http://sv.symcb.com/sv.crt0
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
VeriSign Class 3 Public Primary Certification Authority - G50
131210000000Z
231209235959Z0
Symantec Corporation1
Symantec Trust Network100.
'Symantec Class 3 SHA256 Code Signing CA0
http://s2.symcb.com0
http://www.symauth.com/cps0(
http://www.symauth.com/rpa00
http://s1.symcb.com/pca3-g5.crl0
SymantecPKI-1-5670
Washington1
Redmond1
Microsoft Corporation1)0'
Microsoft Code Verification Root0
110222192517Z
210222193517Z0
VeriSign, Inc.1
VeriSign Trust Network1:08
1(c) 2006 VeriSign, Inc. - For authorized use only1E0C
VeriSign Class 3 Public Primary Certification Authority - G50
http://crl.microsoft.com/pki/crl/products/MicrosoftCodeVerifRoot.crl0
Symantec Corporation1
Symantec Trust Network100.
Symantec Class 3 SHA256 Code Signing CA
20170712011507Z0
Symantec Corporation1
Symantec Trust Network110/
Symantec SHA256 TimeStamping Signer - G2
VeriSign, Inc.1
VeriSign Trust Network1:08
(c) 2008 VeriSign, Inc. - For authorized use only1806
/VeriSign Universal Root Certification Authority0
160112000000Z
310111235959Z0w1
Symantec Corporation1
Symantec Trust Network1(0&
Symantec SHA256 TimeStamping CA0
https://d.symcb.com/cps0%
https://d.symcb.com/rpa0.
http://s.symcd.com06
%http://s.symcb.com/universal-root.crl0
TimeStamp-2048-30
Symantec Corporation1
Symantec Trust Network1(0&
Symantec SHA256 TimeStamping CA0
170102000000Z
280401235959Z0
Symantec Corporation1
Symantec Trust Network110/
(Symantec SHA256 TimeStamping Signer - G20
https://d.symcb.com/cps0%
https://d.symcb.com/rpa0@
/http://ts-crl.ws.symantec.com/sha256-tss-ca.crl0
http://ts-ocsp.ws.symantec.com0;
http://ts-aia.ws.symantec.com/sha256-tss-ca.cer0(
TimeStamp-2048-50
Symantec Corporation1
Symantec Trust Network1(0&
Symantec SHA256 TimeStamping CA

Hasn’t the Symantec CA fallen in disgrace after some … hickups? Are we talking about the same CA here? I don’t know.

Microsoft Installer MSI Files

Size-wise, the contents of the folder .rscr > 2052 > MSI is the most interesting part of the executable — it contains two files without extension which are 7529143 and 8019860 bytes in size respectively, making up 99 percent of the whole .exe archive.

Copying the original files and manually adding the extension .7z to it allows one to also unzip the contents with The Unarchiver.

It turns out that this might be the browser plugins for at least two different browser platforms (maybe Chrome and Internet Explorer?), hinted at by the folder name pnacl.plugins (NaCl and PNaCl).

The PNG image with the path .rscr > 2052 > PNG > 166 hints at the Windows browsers able to run the plugin:

image-8488

146.msi

$ ls -l
total 5736
-rw-r--r--@ 1 mario  staff  388216 12 Jul  2017 QQCertBroker.exe
-rw-r--r--@ 1 mario  staff   56032 13 Jan  2015 QQEditBroker.exe
-rw-r--r--@ 1 mario  staff  373136 12 Jul  2017 TenpayServer.exe
-rw-r--r--@ 1 mario  staff    3746 15 Sep  2014 Whatsnew.txt
-rw-r--r--@ 1 mario  staff   69056 24 Mai  2017 XP.sys
-rw-r--r--@ 1 mario  staff   80800 24 Mai  2017 XP_64.sys
-rw-r--r--@ 1 mario  staff  119168 12 Jul  2017 npqqcert.dll
-rw-r--r--@ 1 mario  staff  243728 12 Jul  2017 npqqedit.dll
drwxr-xr-x@ 3 mario  staff     102  9 Okt  2015 pnacl.plugins
-rw-r--r--@ 1 mario  staff  168400 12 Jul  2017 qqcert.dll
-rw-r--r--@ 1 mario  staff  200144 12 Jul  2017 qqcert64.dll
-rw-r--r--@ 1 mario  staff  291792 12 Jul  2017 qqedit.dll
-rw-r--r--@ 1 mario  staff  354768 12 Jul  2017 qqedit64.dll
-rw-r--r--@ 1 mario  staff   82474 21 Jul  2014 tenpay.ico
-rw-r--r--@ 1 mario  staff  477608 22 Sep  2016 uninstall.exe

147.msi

$ ls -l
total 14040
-rw-r--r--@ 1 mario  staff      466 21 Jul  2014 Microsoft.VC90.ATL.manifest
-rw-r--r--@ 1 mario  staff      532 21 Jul  2014 Microsoft.VC90.DebugCRT.manifest
-rw-r--r--@ 1 mario  staff   915648 12 Apr  2016 QQCertBroker.exe
-rw-r--r--@ 1 mario  staff   886616 12 Apr  2016 TenpayServer.exe
-rw-r--r--@ 1 mario  staff     3746 15 Sep  2014 Whatsnew.txt
-rw-r--r--@ 1 mario  staff    70712 12 Apr  2016 XP.sys
-rw-r--r--@ 1 mario  staff    81944 12 Apr  2016 XP_64.sys
-rw-r--r--@ 1 mario  staff   161784 21 Jul  2014 atl90.dll
-rw-r--r--@ 1 mario  staff   868864 21 Jul  2014 msvcp90d.dll
-rw-r--r--@ 1 mario  staff  1180672 21 Jul  2014 msvcr90d.dll
-rw-r--r--@ 1 mario  staff   157208 12 Apr  2016 npqqcert.dll
-rw-r--r--@ 1 mario  staff   301128 12 Apr  2016 npqqedit.dll
drwxr-xr-x@ 3 mario  staff      102  9 Okt  2015 pnacl.plugins
-rw-r--r--@ 1 mario  staff   404448 12 Apr  2016 qqcert.dll
-rw-r--r--@ 1 mario  staff   475104 12 Apr  2016 qqedit.dll
-rw-r--r--@ 1 mario  staff   605664 12 Apr  2016 qqedit64.dll
-rw-r--r--@ 1 mario  staff  1039152 22 Dez  2015 uninstall.exe

After the Zoom local web server debacle a little more than a month ago, the presence of a executable called TenpayServer.exe is very, very worrysome. Does WeChat Pay sneakily install and permanently enable a local server on the user’s computer? I hope not. Since I didn’t have a (sandboxed) Windows installation at hand, I didn’t try to install the software.

TenpayServer.exe

Running strings against TenpayServer.exe reveals some useable information. The following snippet caught my attention:

Software\Microsoft\SystemCertificates\Root\Certificates\56502166C0DE2488950491C90C7560E0E7AA7378
Blob
China
tenpay.com
CA Center
test
123456789
test1234567890

Let’s hope the last three lines are not credentials, but just some dummy information entered when prompted for some attributes. But why would any developer release such stuff in his software to the public?

The server component also contains at least two Base64 encoded certificates:

-----BEGIN CERTIFICATE-----
MIID5jCCA0+gAwIBAgIJANiV99K+FHI1MA0GCSqGSIb3DQEBBQUAMIGpMQswCQYD
VQQGEwJDTjESMBAGA1UECBMJR1VBTkdET05HMREwDwYDVQQHEwhTSEVOWkhFTjET
MBEGA1UEChMKdGVucGF5LmNvbTEdMBsGA1UECxMUVGVucGF5LmNvbSBDQSBDZW50
ZXIxGzAZBgNVBAMTElRlbnBheS5jb20gUm9vdCBDQTEiMCAGCSqGSIb3DQEJARYT
c2VydmljZUB0ZW5jZW50LmNvbTAeFw0wNzEwMzEwNzMyNTFaFw0xNzEwMjgwNzMy
NTFaMIGpMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR1VBTkdET05HMREwDwYDVQQH
EwhTSEVOWkhFTjETMBEGA1UEChMKdGVucGF5LmNvbTEdMBsGA1UECxMUVGVucGF5
LmNvbSBDQSBDZW50ZXIxGzAZBgNVBAMTElRlbnBheS5jb20gUm9vdCBDQTEiMCAG
CSqGSIb3DQEJARYTc2VydmljZUB0ZW5jZW50LmNvbTCBnzANBgkqhkiG9w0BAQEF
AAOBjQAwgYkCgYEAk5CbjzfySm5KjW9gcgj0HJ+w1gbjT7gKGvQkO0mHfupaRi2Z
fldXAtfevbB6niurg+OdZweIq/2rWZ+vSl7s+HNhTZ1NRSTyRkBlAMYHsFHL6XjJ
L6e4ExTAbwoOfV04RSAL0I8zgMRTqErvWTK+PakAMTKfECkIxHS/qTy05s8CAwEA
AaOCARIwggEOMB0GA1UdDgQWBBQK1EN9BHzh0YAbYxmPJ+GYnNewvzCB3gYDVR0j
BIHWMIHTgBQK1EN9BHzh0YAbYxmPJ+GYnNewv6GBr6SBrDCBqTELMAkGA1UEBhMC
Q04xEjAQBgNVBAgTCUdVQU5HRE9ORzERMA8GA1UEBxMIU0hFTlpIRU4xEzARBgNV
BAoTCnRlbnBheS5jb20xHTAbBgNVBAsTFFRlbnBheS5jb20gQ0EgQ2VudGVyMRsw
GQYDVQQDExJUZW5wYXkuY29tIFJvb3QgQ0ExIjAgBgkqhkiG9w0BCQEWE3NlcnZp
Y2VAdGVuY2VudC5jb22CCQDYlffSvhRyNTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3
DQEBBQUAA4GBABs4cp8iUaZv3d2M7DOR6wTc4MVMWt2fCHS+HzG+GGJCu/G6HOGV
kXi5At9oSb4yOOhfjOg0QM7O8eGWDsN6MgYm7iUGo3OI745pHrbSiuEeOpKEfKGF
FRqHQxBSsoMPWlV7h15HvtFbxuSTb8PmRok7zUzpa8U0R+MBRi53eKlY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEQTCCA6qgAwIBAgIDf/ElMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR1VBTkdET05HMREwDwYDVQQHEwhTSEVOWkhFTjETMBEGA1UEChMKdGVucGF5LmNvbTEdMBsGA1UECxMUVGVucGF5LmNvbSBDQSBDZW50ZXIxGzAZBgNVBAMTElRlbnBheS5jb20gUm9vdCBDQTEiMCAGCSqGSIb3DQEJARYTc2VydmljZUB0ZW5jZW50LmNvbTAeFw0xMDAxMjYwODIzMzNaFw0xMTAxMjYwODIzMzNaMIHSMRMwEQYDVQQGHgoAQwBoAGkAbgBhMQ0wCwYDVQQIHgQAWABYMREwDwYDVQQHHggAdABlAHMAdDEdMBsGA1UECh4UAHQAZQBuAHAAYQB5AC4AYwBvAG0xGzAZBgNVBAseEgBDAEEAIABDAGUAbgB0AGUAcjEPMA0GA1UEAx4GeeZP3VuJMRswGQYDVQQEHhIAMQA4ADYANgAxADQAOAA4ADYxDTALBgNVBCoeBABYAFgxDTALBgNVBAweBABYAFgxETAPBgkqhkiG9w0BCQEWAlhYMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC83a5EE8BOMSLSZDkDi0cCnfgEunH4aYCKiTITrk8lswWrVn+/zg6RyNqqdnZDsJML0tfkJRc/TQpRZ8MFwrtB3sg3Ybve3voj+9DE/+oSedJhQ5jAyLk0EAJ9kCWEzNrRlVSwYZrIvUCvzUGyry3GKLGmkuIuqUjLVIWWIPTLgQIDAQABo4IBSjCCAUYwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdIkNFUy1DQSBHZW5lcmF0ZSBDZXJ0aWZpY2F0ZSIwHQYDVR0OBBYEFAEBqnfS8keTNO0bGzp2fXgV8eVbMIHeBgNVHSMEgdYwgdOAFArUQ30EfOHRgBtjGY8n4Zic17C/oYGvpIGsMIGpMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR1VBTkdET05HMREwDwYDVQQHEwhTSEVOWkhFTjETMBEGA1UEChMKdGVucGF5LmNvbTEdMBsGA1UECxMUVGVucGF5LmNvbSBDQSBDZW50ZXIxGzAZBgNVBAMTElRlbnBheS5jb20gUm9vdCBDQTEiMCAGCSqGSIb3DQEJARYTc2VydmljZUB0ZW5jZW50LmNvbYIJANiV99K+FHI1MAsGA1UdDwQEAwID6DANBgkqhkiG9w0BAQUFAAOBgQBltWSM2Rp9ETyZjEsNUHvNnxPhaSB/ErUq2O0xl18bVFA/c7TuTGcxqzerCHCkwEhAUC6m3qjjyMoJuCYyknnIOjW3ScX0ZZKj+7DlxLaiSSKyb8gXHH3CUvg4H7sle90ugEYQMOzK0apMsK6gLClEa/p1qomrRVL7Rw6cjB0dYQ==
-----END CERTIFICATE-----

In plain text these read:

$ openssl x509 -in certificate-01.txt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d8:95:f7:d2:be:14:72:35
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=CN, ST=GUANGDONG, L=SHENZHEN, O=tenpay.com, OU=Tenpay.com CA Center, CN=Tenpay.com Root CA/emailAddress=service@tencent.com
        Validity
            Not Before: Oct 31 07:32:51 2007 GMT
            Not After : Oct 28 07:32:51 2017 GMT
        Subject: C=CN, ST=GUANGDONG, L=SHENZHEN, O=tenpay.com, OU=Tenpay.com CA Center, CN=Tenpay.com Root CA/emailAddress=service@tencent.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:93:90:9b:8f:37:f2:4a:6e:4a:8d:6f:60:72:08:
                    f4:1c:9f:b0:d6:06:e3:4f:b8:0a:1a:f4:24:3b:49:
                    87:7e:ea:5a:46:2d:99:7e:57:57:02:d7:de:bd:b0:
                    7a:9e:2b:ab:83:e3:9d:67:07:88:ab:fd:ab:59:9f:
                    af:4a:5e:ec:f8:73:61:4d:9d:4d:45:24:f2:46:40:
                    65:00:c6:07:b0:51:cb:e9:78:c9:2f:a7:b8:13:14:
                    c0:6f:0a:0e:7d:5d:38:45:20:0b:d0:8f:33:80:c4:
                    53:a8:4a:ef:59:32:be:3d:a9:00:31:32:9f:10:29:
                    08:c4:74:bf:a9:3c:b4:e6:cf
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                0A:D4:43:7D:04:7C:E1:D1:80:1B:63:19:8F:27:E1:98:9C:D7:B0:BF
            X509v3 Authority Key Identifier: 
                keyid:0A:D4:43:7D:04:7C:E1:D1:80:1B:63:19:8F:27:E1:98:9C:D7:B0:BF
                DirName:/C=CN/ST=GUANGDONG/L=SHENZHEN/O=tenpay.com/OU=Tenpay.com CA Center/CN=Tenpay.com Root CA/emailAddress=service@tencent.com
                serial:D8:95:F7:D2:BE:14:72:35

            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
         1b:38:72:9f:22:51:a6:6f:dd:dd:8c:ec:33:91:eb:04:dc:e0:
         c5:4c:5a:dd:9f:08:74:be:1f:31:be:18:62:42:bb:f1:ba:1c:
         e1:95:91:78:b9:02:df:68:49:be:32:38:e8:5f:8c:e8:34:40:
         ce:ce:f1:e1:96:0e:c3:7a:32:06:26:ee:25:06:a3:73:88:ef:
         8e:69:1e:b6:d2:8a:e1:1e:3a:92:84:7c:a1:85:15:1a:87:43:
         10:52:b2:83:0f:5a:55:7b:87:5e:47:be:d1:5b:c6:e4:93:6f:
         c3:e6:46:89:3b:cd:4c:e9:6b:c5:34:47:e3:01:46:2e:77:78:
         a9:58

… and …

$ openssl x509 -in certificate-02.txt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 8384805 (0x7ff125)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=CN, ST=GUANGDONG, L=SHENZHEN, O=tenpay.com, OU=Tenpay.com CA Center, CN=Tenpay.com Root CA/emailAddress=service@tencent.com
        Validity
            Not Before: Jan 26 08:23:33 2010 GMT
            Not After : Jan 26 08:23:33 2011 GMT
        Subject: C=\x00C\x00h\x00i\x00n\x00a, ST=\x00X\x00X, L=\x00t\x00e\x00s\x00t, O=\x00t\x00e\x00n\x00p\x00a\x00y\x00.\x00c\x00o\x00m, OU=\x00C\x00A\x00 \x00C\x00e\x00n\x00t\x00e\x00r, CN=y\xE6O\xDD[\x89, SN=\x001\x008\x006\x006\x001\x004\x008\x008\x006, GN=\x00X\x00X/title=\x00X\x00X/emailAddress=XX
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:bc:dd:ae:44:13:c0:4e:31:22:d2:64:39:03:8b:
                    47:02:9d:f8:04:ba:71:f8:69:80:8a:89:32:13:ae:
                    4f:25:b3:05:ab:56:7f:bf:ce:0e:91:c8:da:aa:76:
                    76:43:b0:93:0b:d2:d7:e4:25:17:3f:4d:0a:51:67:
                    c3:05:c2:bb:41:de:c8:37:61:bb:de:de:fa:23:fb:
                    d0:c4:ff:ea:12:79:d2:61:43:98:c0:c8:b9:34:10:
                    02:7d:90:25:84:cc:da:d1:95:54:b0:61:9a:c8:bd:
                    40:af:cd:41:b2:af:2d:c6:28:b1:a6:92:e2:2e:a9:
                    48:cb:54:85:96:20:f4:cb:81
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                "CES-CA Generate Certificate"
            X509v3 Subject Key Identifier: 
                01:01:AA:77:D2:F2:47:93:34:ED:1B:1B:3A:76:7D:78:15:F1:E5:5B
            X509v3 Authority Key Identifier: 
                keyid:0A:D4:43:7D:04:7C:E1:D1:80:1B:63:19:8F:27:E1:98:9C:D7:B0:BF
                DirName:/C=CN/ST=GUANGDONG/L=SHENZHEN/O=tenpay.com/OU=Tenpay.com CA Center/CN=Tenpay.com Root CA/emailAddress=service@tencent.com
                serial:D8:95:F7:D2:BE:14:72:35

            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment, Key Agreement
    Signature Algorithm: sha1WithRSAEncryption
         65:b5:64:8c:d9:1a:7d:11:3c:99:8c:4b:0d:50:7b:cd:9f:13:
         e1:69:20:7f:12:b5:2a:d8:ed:31:97:5f:1b:54:50:3f:73:b4:
         ee:4c:67:31:ab:37:ab:08:70:a4:c0:48:40:50:2e:a6:de:a8:
         e3:c8:ca:09:b8:26:32:92:79:c8:3a:35:b7:49:c5:f4:65:92:
         a3:fb:b0:e5:c4:b6:a2:49:22:b2:6f:c8:17:1c:7d:c2:52:f8:
         38:1f:bb:25:7b:dd:2e:80:46:10:30:ec:ca:d1:aa:4c:b0:ae:
         a0:2c:29:44:6b:fa:75:aa:89:ab:45:52:fb:47:0e:9c:8c:1d:
         1d:61

Both certificates have expired; the first one on Oct 28 07:32:51 2017 GMT, the second on Jan 26 08:23:33 2011 GMT. Why would somebody distribute expired certificates?

Changelog

The developers of this plugin also were nice enough to even distribute a change log in the file Whatsnew.txt. Unfortunately, it is written in Chinese. Google Translate helps to translate its contents to English:

============================================

TenPay Security Control 2.0.2.6

1. Enhance the security control driver's password protection function

============================================

TenPay Security Control 2.0.2.5

1. Solve the problem that the certificate control service program is disabled, which can prevent the security software from disabling the TenPay service, causing the payment function to be blocked.

============================================

Tenpay security control 2.0.2.4

1. Fix chrome (32 or above) does not display the password control properly

============================================

TenPay Security Control 2.0.2.3

1. Optimize chrome (32 or above) and firefox (26 or above) to manually enable plugins
2. Fix the chrome when the password control appears, the right click menu clicks invalid question
3. Password control supports keyboard caps Lock when prompted to caps lock

============================================

TenPay Security Control 2.0.2.2

1. Fix "My Wallet" can't enable plugin problem
2. Fix the latest version of chrome focus confusion
3. Synchronously updated the installation package browser logo

============================================

Tenpay Security Control 2.0.2.1

1. Compatible with IE11 browser
2. Increase the synchronization protection of the keyboard driver

============================================

Tenpay security control 2.0.1.4

1. Password control officially supports 64-bit browser
2. Password control in safe mode is compatible with multiple monitors
3. Add a new functional interface to get the expiration time of the digital certificate
4. Optimize the installation package to support the installation without restarting the browser.

============================================

TenPay Security Control 2.0.1.0

1. Fix a vulnerability that can be remotely signed under win7;
2. Fix the encoding problem of Chinese signatures in non-IE kernel browsers.

============================================

TenPay Security Control 2.0.0.9

1. Increase the system taskbar security tips, the account funds intimate protection

============================================

Tenpay security control 2.0.0.7

1. Increase the compatibility of security controls and financial shields to optimize compatibility;
2. Optimize the performance of the control under the Windows 7 operating system, taking up less memory.

============================================

TenPay Security Control 2.0.0.6

1. Increase the access function of the treasury shield interface to support the use of the vouchers by ordinary users;
2. Fix the hidden danger of a button message hook security mechanism.

============================================

Tenpay security control 2.0.0.4

1. Add the merchant root certificate, and the Tenpay merchant can log in to Tenpay after installing the security control. There is no need to manually install the certificate again.
2. Added cab package for 64-bit IE to optimize support for 64-bit Windows operating system.

============================================

TenPay Security Control 2.0.0.3

1. Add the “Add to Desktop” option to make it easier and faster to access TenPay;
2. Optimize the control's response to the keyboard to make your operation smoother;
3. Further optimize browser compatibility and continuously upgrade performance.

============================================

TenPay Security Control 2.0.0.2

1. Optimize the performance of security controls;
2. Fix a compatibility issue and improve compatibility with dual-core browsers such as QQ browser.

============================================

TenPay Security Control 2.0.0.1

1. New UI design, new visual experience;
2. Optimized and upgraded control performance for a smoother operation experience;
3. Perfectly compatible with 3 browsers, Sogou browser and Firefox browser green version;
4. Increase the security and stability of the password control, strengthen security and ensure password security;
5. New process detection mechanism, the control installation is smoother.

While reading the change log, I stopped at the following bullet point:

Add the merchant root certificate, and the Tenpay merchant can log in to Tenpay after installing the security control. There is no need to manually install the certificate again.

Does the software also install an additional root certificate on the local computer? Is this a system-wide installation, or user-specific — or even only restricted to the browser? Can this root certificate be trusted, especially that the name Symantec appears in the certificate file?

Questions after questions.

Preliminary Conclusion

This plugin looks dubious to me, and if I was an attacker, I would try to figure out if I could somehow take over browsers running this plugin.

A quick Google Search for tenpaycert.exe and for TenpayServer.exe showed me that nobody ever seems to have looked at this piece of software. Maybe it’s time that Security Researchers start to do so …

Tags: , , , , , , , ,
Labels: Security

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 21. Juli 2019

pixelserver-tls läuft nicht unter Debian 10 „Buster“

Mittels eines „manuellen“ Canary-Releases habe ich vor einer Woche einen meiner Linux-Server hier im Haus von Debian 9 „Stretch“ auf Debian 10 „Buster“ migriert.

Wie es zu erwarten war, klappte das nicht ganz ohne Schluckauf. Beispielsweise schaltet sich der Monitor meines Lenovo ThinkPads X201 (P/N 3626GN7) nicht mehr automatisch aus. Leider habe ich die Lösung im Internet noch nicht gefunden.

Das beunruhigendste Problem war aber folgende Fehlermeldung von monit, die nach der Neukompilierung von pixelserv-tls mit Debian 10 „Buster“ in meinem Postfach landete:

Connection failed Service pixelserv-tls 

	Date:        Mon, 15 Jul 2019 22:44:25
	Action:      restart
	Host:        ADBLOCKER
	Description: failed protocol test [HTTP] at [10.1.2.3]:443 [TCP/IP TLS] -- SSL connection error: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error

Your faithful employee,
Monit

Der Aufruf der Statusseite unter http://10.1.2.3/servstats funktionierte ebenfalls nicht.

Am letzten Freitag fand ich nun etwas Zeit, um das Problem genauer anzuschauen.

Software-Versionen

pixelserv-tls hat seit Monaten keine Anpassung mehr erfahren — beim Abgleich meiner Sourcen mit denjenigen auf GitHub gab es nur in cert.c eine Anpassung, die ich einspielte, aber eigentlich nichts mit dem hier beschriebenen Problem zu tun hat.

Eine Ursache für das Problem war aber, dass die OpenSSL-Library, gegen welche pixelserv-tls kompiliert wird, aktualisiert worden war. Auf einem System mit Stretch (stable) waren installiert …

# dpkg --list | grep -i ssl
ii  libcurl3:amd64                       7.52.1-5+deb9u9                   amd64        easy-to-use client-side URL transfer library (OpenSSL flavour)
ii  libcurl4-openssl-dev:amd64           7.52.1-5+deb9u9                   amd64        development files and documentation for libcurl (OpenSSL flavour)
ii  libflac8:amd64                       1.3.2-1                           amd64        Free Lossless Audio Codec - runtime C library
ii  libgnutls-openssl27:amd64            3.5.8-5+deb9u4                    amd64        GNU TLS library - OpenSSL wrapper
ii  libio-socket-ssl-perl                2.044-1                           all          Perl module implementing object oriented interface to SSL sockets
ii  libnet-smtp-ssl-perl                 1.04-1                            all          Perl module providing SSL support to Net::SMTP
ii  libnet-ssleay-perl                   1.80-1                            amd64        Perl module for Secure Sockets Layer (SSL)
ii  libssl-dev:amd64                     1.1.0j-1~deb9u1                   amd64        Secure Sockets Layer toolkit - development files
ii  libssl-doc                           1.1.0j-1~deb9u1                   all          Secure Sockets Layer toolkit - development documentation
ii  libssl1.0.0:amd64                    1.0.1t-1+deb8u6                   amd64        Secure Sockets Layer toolkit - shared libraries
ii  libssl1.0.2:amd64                    1.0.2r-1~deb9u1                   amd64        Secure Sockets Layer toolkit - shared libraries
ii  libssl1.1:amd64                      1.1.0j-1~deb9u1                   amd64        Secure Sockets Layer toolkit - shared libraries
ii  mitmproxy                            0.18.2-6                          all          SSL-capable man-in-the-middle HTTP proxy
ii  openssl                              1.1.0j-1~deb9u1                   amd64        Secure Sockets Layer toolkit - cryptographic utility
ii  perl-openssl-defaults:amd64          3                                 amd64        version compatibility baseline for Perl OpenSSL packages
ii  python-backports.ssl-match-hostname  3.5.0.1-1                         all          Backport of the Python 3.5 SSL hostname checking function
ii  python-brotli                        0.5.2+dfsg-2                      amd64        lossless compression algorithm and format (Python 2 version)
ii  python-certifi                       2016.2.28-1                       all          root certificates for validating SSL certs and verifying TLS hosts
ii  python-openssl                       16.2.0-1                          all          Python 2 wrapper around the OpenSSL library
ii  python-passlib                       1.7.0-2                           all          comprehensive password hashing framework
ii  python-service-identity              16.0.0-2                          all          Service identity verification for pyOpenSSL (Python 2 module)
ii  ssl-cert                             1.0.39                            all          simple debconf wrapper for OpenSSL

… auf dem neuen System war hingegen installiert:

# dpkg --list | grep -i ssl
ii  libcurl4:amd64                 7.64.0-4                     amd64        easy-to-use client-side URL transfer library (OpenSSL flavour)
ii  libgnutls-openssl27:amd64      3.6.7-4                      amd64        GNU TLS library - OpenSSL wrapper
ii  libio-socket-ssl-perl          2.060-3                      all          Perl module implementing object oriented interface to SSL sockets
ii  libnet-smtp-ssl-perl           1.04-1                       all          Perl module providing SSL support to Net::SMTP
ii  libnet-ssleay-perl             1.85-2+b1                    amd64        Perl module for Secure Sockets Layer (SSL)
ii  libssl-dev:amd64               1.1.1c-1                     amd64        Secure Sockets Layer toolkit - development files
ii  libssl-doc                     1.1.1c-1                     all          Secure Sockets Layer toolkit - development documentation
ii  libssl1.0.0:amd64              1.0.1t-1+deb8u7              amd64        Secure Sockets Layer toolkit - shared libraries
ii  libssl1.1:amd64                1.1.1c-1                     amd64        Secure Sockets Layer toolkit - shared libraries
ii  libzstd1:amd64                 1.3.8+dfsg-3                 amd64        fast lossless compression algorithm
ii  mitmproxy                      4.0.4-5                      all          SSL-capable man-in-the-middle HTTP proxy
ii  openssl                        1.1.1c-1                     amd64        Secure Sockets Layer toolkit - cryptographic utility
ii  perl-openssl-defaults:amd64    3                            amd64        version compatibility baseline for Perl OpenSSL packages
ii  python3-brotli                 1.0.7-2                      amd64        lossless compression algorithm and format (Python 3 version)
ii  python3-certifi                2018.8.24-1                  all          root certificates for validating SSL certs and verifying TLS hosts (python3)
ii  python3-openssl                19.0.0-1                     all          Python 3 wrapper around the OpenSSL library
ii  python3-passlib                1.7.1-1                      all          comprehensive password hashing framework
ii  ssl-cert                       1.0.39                       all          simple debconf wrapper for OpenSSL

Relevant ist das Paket libssl-dev — auf Stretch war die Library 1.1.0j-1~deb9u1, in Buster 1.1.1c-1. Gegen diese kompiliert pixelserv-tls.

TLSv1.3?

Um Probleme mit TLSv1.3 auszuschliessen, hackte ich util.h und stellte das Script so ein, dass TLSv1.3-Support nie einkompiliert wird:

...
# ifdef TLS1_3_VERSION
#   define FEAT_TLS1_3  " no_tls1_3"
# else
#   define FEAT_TLS1_3  " no_tls1_3"
# endif
...

Leider half dies nichts zur Lösung des Problems.

Indem man pixelserv-tls ausführt, erfährt man, ob TLSv1.3 einkompiliert ist oder nicht:

$ pixelserv-tls --help
pixelserv-tls 2.2.1 (compiled: Jul 15 2019 22:34:41 flags: tfo tls1_3)
...

Respektive:

$ pixelserv-tls --help
pixelserv-tls 2.2.1 (compiled: Jul 15 2019 22:48:04 flags: tfo no_tls1_3)
...

Dasselbe erfährt man auch in error.log, wenn pixelserv-tls gestartet wird:

...
Jul 19 19:52:46 localhost pixelserv-tls[28352]: pixelserv-tls 2.2.1 (compiled: Jul 19 2019 19:51:13 flags: tfo no_tls1_3) options: 10.1.2.3 -u root -p 80 -k 443 -l 5 -z /tmp/pixelserv
...

AppArmor?

Zuerst vermutete ich ein Problem mit AppArmor, welches in Debian 10 out-of-the-box aktiviert ist und läuft. Doch nachdem ich mich ein wenig eingelesen hatte, war mir klar, dass AppArmor nur dann zur Anwendung kommt, wenn ein entsprechendes Applikationsprofil erstellt wurde. Auch scheint es keine Standardeinstellungen zu geben, die auf alle Prozesse angewendet werden.

Log-Analyse

Basierend auf den lokalen Einstellungen loggt pixelserv-tls mehr oder weniger hilfreiche Informationen in das syslog. Auf Grund der von mir temporär gewählten Kommandozeilenoption -l 4 („4“ steht für den Loglevel „info“) las ich dort:

$ tail -f /var/log/error.log
...
Jul 19 19:04:00 localhost pixelserv-tls[22361]: create_child_sslctx: cannot find or use $CERTDIR/_.google-analytics.com
Jul 19 19:04:00 localhost pixelserv-tls[22361]: tls_clienthello_cb: fail to create sslctx or cache _.google-analytics.com
...

Fragezeichen über Fragezeichen — haben wir ein Problem mit den Zertifikatsdateien?

Datei- und Verzeichnisberechtigungen

Dann vermutete ich Probleme beim Lesen und Schreiben der Zertifikate, obwohl ich an der Ordnerstruktur und den Ordner- und Dateiberechtigungen nichts geändert hatte. Sowohl das Starten von pixelserv-tls mit der Option -u root (normalerweise läuft pixelserv-tls unter „nobody“ — Sicherheitstechnisch eine sehr weise Einstellung, da die Software wie auch OpenSSL Schwachstellen aufweisen könnten, die dann jeder im lokalen Netzwerk ausnützen könnte) als auch das Verschieben des Zertifikatsordner nach /tmp/pixelserv lösten das Problem nicht.

Mit strace die Syscalls auf das Dateisystem anschauen

Auch die Verwendung von strace — einem Werkzeug, das ich nur bei ganz hartnäckigen Problemen zur Anwendung kommen lasse, zeigte keinen Hinweis, der mich auf die richtige Fährte gebracht hätte. Was ich lernte: Mittels der Option -p kann man sich bei strace in einen bereits laufenden Prozess „einklinken“. Hier das Resultat

# strace -p %PID%
...
select(8, [5 6 7], NULL, NULL, NULL)    = 1 (in [6])
accept(6, {sa_family=AF_INET, sin_port=htons(64242), sin_addr=inet_addr("10.0.1.102")}, [16]) = 9
fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(9, F_SETFL, O_RDWR)               = 0
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(9, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\360I\2\0\0\0\0\0", 16) = 0
getsockname(9, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("10.1.2.3")}, [128->16]) = 0
read(9, "\26\3\1\0\353", 5)             = 5
read(9, "\1\0\0\347\3\3n\277\307zl\26\2155A\257@\nFK\272\326x:Z\320\32:\347\32\2\217"..., 235) = 235
stat("/usr/local/apps/pixelserv/certs/_.optimizely.com", {st_mode=S_IFREG|0644, st_size=1596, ...}) = 0
openat(AT_FDCWD, "/usr/local/apps/pixelserv/certs/_.optimizely.com", O_RDONLY) = 10
fstat(10, {st_mode=S_IFREG|0644, st_size=1596, ...}) = 0
read(10, "-----BEGIN CERTIFICATE-----\nMIIB"..., 4096) = 1596
close(10)                               = 0
getpid()                                = 23461
sendto(3, "<27>Jul 19 19:21:47 pixelserv-tl"..., 131, MSG_NOSIGNAL, NULL, 0) = 131
getpid()                                = 23461
sendto(3, "<27>Jul 19 19:21:47 pixelserv-tl"..., 109, MSG_NOSIGNAL, NULL, 0) = 109
write(9, "\25\3\3\0\2\2P", 7)           = 7
getpid()                                = 23461
sendto(3, "<28>Jul 19 19:21:47 pixelserv-tl"..., 141, MSG_NOSIGNAL, NULL, 0) = 141
shutdown(9, SHUT_RDWR)                  = 0
close(9)

Da sah alles Bestens aus — das Zertifikat kann gelesen werden, wie die erste Zeile read(10, "-----BEGIN CERTIFICATE-----\nMIIB"..., 4096) = 1596
verdeutlicht.

Quellcode-Analyse

Als nächstes muss man sich in solchen hartnäckigen Fällen mit dem Source-Code auseinandersetzen. Ich durchsuchte das GitHub-Repository nach folgender Fehlermeldung: „cannot find or use“. Fündig wurde ich dazu in cert.c, ab Zeile 814:

...
if(SSL_CTX_use_certificate_file(sslctx, full_pem_path, SSL_FILETYPE_PEM) <= 0
       || SSL_CTX_use_PrivateKey_file(sslctx, full_pem_path, SSL_FILETYPE_PEM) <= 0)
    {
        SSL_CTX_free(sslctx);
        log_msg(LGG_ERR, "%s: cannot find or use %s\n", __FUNCTION__, full_pem_path);
        return NULL;
    }
...

Na toll! Die Log-Meldung wird somit generiert, wenn die OpenSSL-nativen-Funktionen SSL_CTX_use_certificate_file() oder SSL_CTX_use_PrivateKey_file() einen Wert zurückgeben, der kleiner gleich 0 ist. Gemäss Dokumentation der quelloffenen Library meldet ein Rückgabewert von 1, dass die Funktion erfolgreich ausgeführt wurde.

Quellcode hacken

Ich bin kein C-Programmierer, aber mir gefiel die Programmlogik aus folgenden Gründen nicht:

  1. Wenn eine der beiden Funktionen einen Fehler zurückgibt, bricht der Programmcode ab. Schön, dass man den Code damit komprimiert hat, aber beim Debugging wäre es noch nett zu wissen, welche der beiden Funktionen den Fehler generiert.
  2. Die Fehlermeldung "%s: cannot find or use %s\n" mit den zwei Variablen "Funktion" sowie dem Pfad zum Zertifikat sagt rein gar nichts darüber, was denn nun konkret schiefgegangen ist.
  3. <= 0 empfinde ich als den falschen Ansatz: Ich würde stattdessen prüfen, ob der Rückgabewert NICHT 1 entspricht (an dem sind wir interessiert).

Um dem Problem näher zu kommen war es deshalb nötig, dass ich selbst Hand an den Code anlegte, die Logik entzwirnte sowie die in OpenSSL intern vorhandenen detaillierten Fehlermeldungen in das Log ausgab. Natürlich fand ich über etwas Googlen heraus, wie man OpenSSL diese Fehlermeldung entlockt. Dies führte zu folgendem Code:

...
    if(!SSL_CTX_use_certificate_file(sslctx, full_pem_path, SSL_FILETYPE_PEM)) {
        log_msg(LGG_ERR, "%s: SSL_CTX_use_certificate_file error for file %s with error %s\n", __FUNCTION__, full_pem_path, ERR_error_string( ERR_get_error(), NULL ));
    }
    if(!SSL_CTX_use_PrivateKey_file(sslctx, full_pem_path, SSL_FILETYPE_PEM)) {
        log_msg(LGG_ERR, "%s: SSL_CTX_use_PrivateKey_file error for file %s with error %s\n", __FUNCTION__, full_pem_path, ERR_error_string( ERR_get_error(), NULL ));
    }
...

Die wahre Fehlermeldung

Neu kompiliert, installiert und gestartet, dann die Werbeschleuder SPIEGEL Online angesurft und das Log überprüft:

$ tail -f /var/log/error.loa
...
create_child_sslctx: SSL_CTX_use_certificate_file error for file /tmp/pixelserv/_.ioam.de with error error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
...

"ee key too small"? Now we're talking! Eine erneute Google-Suche ergab, dass sich OpenSSL 1.1.1 (im Gegensatz zu 1.1.0) weigert, ein Zertifikat zu verarbeiten, dessen RSA-Schlüssellänge kleiner als 2048 Bit ist.

Die Lösung des Problems

Ich nahm deshalb folgende zwei Anpassungen vor:

Zuerst einmal generierte ich eine neue ca.key mit einer Schlüssellänge von 2048 Bits:

$ openssl genrsa -out $CERTDIR/ca.key 2048

Anschliessend passte ich auch noch cert.c an, da dort die mittlerweile als schwach erachtete Schlüssellänge (1024) hartkodiert ist:

...
if (RSA_generate_key_ex(rsa, 2048, e, NULL) < 0)
...

Seit ich pixelserv-tls ein letztes Mal neu kompiliert und installiert habe, funktioniert das Schwarze Loch für alle Arten von Web-basierten Trackern wieder einwandfrei.

Verifikation

Überprüfen kann man das ... natürlich auch mit openssl auf einem separaten Client:

pixelserv-tls funktioniert nicht (richtig)

$ openssl s_client -connect www.googleadservices.com:443
CONNECTED(00000003)
140735858492360:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:s23_clnt.c:802:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1563537109
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

pixelserv-tls funktioniert (richtig)

Und jetzt:

CONNECTED(00000003)
depth=1 CN = Pixelserv CA
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
 0 s:/CN=10.1.2.3
   i:/CN=Pixelserv CA
 1 s:/CN=Pixelserv CA
   i:/CN=Pixelserv CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MII...=
-----END CERTIFICATE-----
subject=/CN=10.1.2.3
issuer=/CN=Pixelserv CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2148 bytes and written 434 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: F66E6966BF7CE8F970AF4834A1CC45FE396D1F7B041F512CA5B3F65419EACD24
    Session-ID-ctx: 
    Master-Key: 7EE1C54219A4CABF0BEB73BB420C93DD4F51F5F319897937137B9C1093045B4EB91B0FD50F30154DF5A7D18AD95A493C
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - e8 63 17 bb 31 c0 91 7d-95 eb f8 b4 78 dc a6 89   .c..1..}....x...
    0010 - be 14 43 2c ac cc 4c dd-f3 e9 9d f5 cb 36 46 a4   ..C,..L......6F.
    0020 - c6 9a 67 7c fb 83 a1 a6-6d 74 6b 62 4e b5 60 33   ..g|....mtkbN.`3
    0030 - 8b 1b 5f 1f cf ba c6 bf-73 c0 8a 7d 31 db 8a 75   .._.....s..}1..u
    0040 - 81 8b b3 c3 e5 76 1e 34-c3 3d 2e 11 e4 58 a3 fc   .....v.4.=...X..
    0050 - 73 5b 2e 9c 13 f5 64 4e-c3 26 10 98 96 e1 64 aa   s[....dN.&....d.
    0060 - ce 41 aa cd 54 68 12 a1-87 10 98 cc f0 e5 e9 d9   .A..Th..........
    0070 - de ec e6 2e 83 80 8f 51-71 ff 07 eb a7 b2 66 ae   .......Qq.....f.
    0080 - ad b5 44 c0 47 06 eb b7-5f 19 c2 74 5d 1f 47 20   ..D.G..._..t].G 
    0090 - 5d 93 0f 57 c4 ee 86 b7-7e 7f e3 2a ed 57 27 43   ]..W....~..*.W'C

    Start Time: 1563745313
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
---

Das Problem habe ich nun auch im GitHub Issue-Tracker des Projekts beschrieben ("Use 2048-bit RSA key to make pixelserv-tls work on Debian 10 "Buster""). Eigentlich hätte ich den Patch ja auch gleich selber als Pull Request hochladen können, doch diese Funktion von Git verstehe ich immer noch nicht wirklich richtig ... hoffen wir, dass der Maintainer die Ursache des Problems deshalb selber bald beseitigt.

Tags: , , , , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Dienstag, 16. Juli 2019

Somfy RTS-Storen von einem PC aus steuern

Vor einiger Zeit hat mir ein Bekannter mit Elektriker-Ausbildung gezeigt, dass unsere Wandschalter zum Steuern der Fensterstoren (Lamellen) mit einem Schraubenzieher ganz einfach aus der Fassung zu hebeln sind. Im Grunde ist es nur eine Platine, gespiesen von einer Flachbatterie, mit drei Knöpfen, die über Funksignale die Motoren unserer Lamellen steuern.

image-8445

image-8446

Dem Schalter ist zu entnehmen, dass es sich um ein Produkt des französischen Herstellers Somfy handelt.

Nachdem ich den Schalter von der Wand entfernt hatte, konnte ich auf dem Rücken der Platine die genaue Typenbezeichnung unserer Storen lesen: Somfy Centralis RTS (Handbuch).

Daraufhin machte ich mich auf die Suche nach Handbüchern und Steuerungen.

Rasch war nach der Lektüre des Handbuchs klar, dass sich die Motoren der Storen mit weiteren (offiziellen) Schaltern paaren lassen. Hierzu dient der Knopf „PROG“ auf der Rückseite bereits verbundener Schalter, die einen Motor in den „Paarungsmodus“ setzen.

Auf Ricardo ersteigerte ich mir deshalb kurzerhand zwei weitere solche Schalter mit der Idee, einen davon auf dem Nachttisch zu platzieren, und den anderen portabel zu belassen.

Doch das ist heutzutage, im Zeitalter der Heimautomation, nur die halbe Miete: Diese Dinger muss man von einem PC aus steuern können, denn dann kann man nämlich nette Automationen bauen. Beispielsweise die Storen bei Sonnenaufgang hochfahren, bei Sonnenuntergang herunterfahren, oder wenn es zu heiss wird (bedingt Temperatursensoren auf dem Fenstersims) herunterfahren, damit sich die Zimmer nicht unnötig aufheizen.

USB-Fernbedienung eines Drittherstellers

Nach etwa einer Stunde Google stiess ich auf das Gerät RFXtrx433XL USB HA controller des Herstellers RFXCOM, welche auf dem auch von Somfy verwendeten Frequenzband 433 MHz sendet und empfängt.

Ohne lange zu überlegen habe ich mir dann über den Schweizer Online-Shop Swiss Domotique ein Exemplar dieses Geräts geleistet; heute Dienstag ist es nun per Paketpost angekommen.

USB-Fernbedienung mit den Somfy Motoren verbinden

Hierzu ist leider ein Windows-PC nötig, auf welchem man die offizielle Software RFXmngr installiert (Download). Sobald das geschehen ist, verbindet man die USB-Fernbedienung mit dem Computer, startet das Programm und verbindet sich auf die Fernbedienung.

Im besten Fall füllt sich das Log im gelben Bereich des Tools bereits jetzt von alleine, wenn der Empfänger Signale in der Luft auffängt. Bei mir war dies der Fall; jemand in der Nachbarschaft scheint einen Oregon Scientific Temperatursensor zu betreiben:

16.07.2019 07:44:06:777
Packettype    = TEMP_HUM
subtype       = TH1 - THGN122/123/132,THGR122/228/238/268
                channel 1
Sequence nbr  = 0
ID            = D401 decimal:54273
Temperature   = 23.8 °C
Humidity      = 22
Status        = Dry
Signal level  = 5  -80dBm
Battery       = Low

Um die drei Motoren in unserer Mietwohnung zu paaren, bin ich der französischen, bebilderten Anleitung auf einem Blog gefolgt. Ich habe die Storen jeweils ganz hochgefahren, denn würde mit dem Paaren etwas komplett schief laufen und der bestehende Schalter auch die Verbindung zum Motor verlieren, würde jedenfalls immer noch Tageslicht in den Raum fallen. Anschliessend habe ich mit einem flachen Schraubenzieher den Schalter aus der Fassung rausgehebelt, damit ich Zugang zum jeweiligen PROG-Knopf besass. Als nächstes wechselte ich in der Software auf das Tab RFY, stellte dort eine frei gewählte fünfstellige ID sowie den einstelligen Unit Code ein (diese Zahlen unbedingt aufschreiben, mitsamt dem zugewiesenen Motor), setzte das Dropdown auf Program. Nun drückte ich den PROG-Knopf, bis sich die Storen kurz bewegten — das Signal, dass der Motor nun für die Paarung mit einer zusätzlichen Fernbedienung bereit ist. Anschliessend drückte ich in der Software auf Transmit, worauf sich die Storen noch einmal kurz bewegten. Die Paarung war somit abgeschlossen, und ab sofort konnte ich über das Dropdown in der Software Kommandos an die Store übermitteln.

image-8447

Ich entschied mich, für jeden Motor eine eigenständige ID sowie einen Unit Code auszuwählen — denn, so denke ich mir, mit einem Script kann ich ja problemlos alle Storen in Serie herunter- oder hochfahren. Mindestens einen der Original Somfy-Schalter, welche ich auf Ricardo ersteigert habe, werde ich hingegen mit allen drei Motoren gleichzeitig paaren und so mittels eines Knopfdrucks alle Storen in der Wohnung hoch- oder herunterfahren.

Programmierung

Um meine Storen zu steuern möchte ich aber a) keinen Windows-PC in meinem Netzwerk am Laufen haben und b) auch nicht ein Win32-Software-GUI von RFXCOM verwenden — denn ein GUI ist nicht scriptbar. Somit machte ich mich auf die Suche nach einer Möglichkeit, das USB-Gerät an einen Linux-PC anzuschliessen und dann mit einer Programmiersprache zu steuern.

Fündig wurde ich bei der offiziellen nodejs-Bibliothek des Herstellers selber, freundlicherweise auf Github gehostet: rfxcom/node-rfxcom.

Installiert wird dies — ein funktionierendes nodejs vorausgesetzt — mittels …

# npm install rfxcom

Folgende Minimalvariante eines nodejs-Scripts lässt die Motoren bewegen:

var rfxcom = require('rfxcom');
var rfxtrx = new rfxcom.RfxCom('/dev/ttyUSB1', {debug: true});
var rfy = new rfxcom.Rfy(rfxtrx, rfxcom.rfy.RFY);
rfxtrx.initialise(function () {
    rfy.doCommand('0x00000/0', 'up', function(err, res, sequenceNumber) {
        if (!err) {
            console.log('Action succeeded');
            process.exit(0);
        }
        else {
            console.log('ERROR[' + res + ']: ' + err + ' with sequenceNumber=' + sequenceNumber);
            process.exit(1);
        }
    });
});

Erläuterungen:

  • /dev/ttyUSB1: An welchem USB-Port hängt der RFXtrx433XL? Vgl. auch nachfolgende Erläuterungen mit dmesg
  • 0x00000/0: Die ID und Unit des Motors, getrennt mit einem Slash. Entspricht der ID und der Unit, welche man im Software-GUI bei der Initialisierung eingegeben hat. Bei mir war keine Umrechnung in Hex nötig; einfach so eingeben, wie die Nummer im GUI ausgewählt wurde.
  • up: Das zu sendende Kommando. Im Software-GUI sind alle Kommandos aufgeführt; ich persönlich brauche aber derzeit nur „up“ sowie „down“. In der nodejs-Bibliothek sind die verfügbaren Befehle auch erwähnt (siehe „RfyCommands“).

Um herauszufinden, auf welchem USB-Port das Gerät lauscht, reicht ein Blick in die Ausgabe des Befehls dmesg:

...
[74849.641113] usb 1-1.2: new full-speed USB device number 7 using ehci-pci
[74849.756549] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6015, bcdDevice=10.00
[74849.756556] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[74849.756560] usb 1-1.2: Product: RFXtrx433XL
[74849.756564] usb 1-1.2: Manufacturer: RFXCOM
[74849.756567] usb 1-1.2: SerialNumber: 00000000
[74849.788659] usbcore: registered new interface driver ftdi_sio
[74849.788692] usbserial: USB Serial support registered for FTDI USB Serial Device
[74849.788949] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[74849.789022] usb 1-1.2: Detected FT-X
[74849.790248] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB1

Für Nicht-root-Benutzer ausführbar machen

Damit das finale Script auch normale Linux-Benutzer ausführen können, muss man den gewünschten Benutzer noch der Benutzergruppe dialout zuweisen, damit er auf die USB-Schnittstelle zugreifen kann:

# adduser santa dialout

Nächste Schritte

  • Ein Web-Interface bauen, über welches man — bspw. im Bett liegend — die Storen betätigen kann
  • Das Script mit anderen Scripts koppeln, die bspw. bei erhöhter Temperatur am Fenstersims reagieren

Tags: , , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 30. Juni 2019

Irgendwas ist am UniFi Firmware 4.0.42.10433 nicht ganz koscher

Bis vor wenigen Wochen hatte ich nie irgendwelche Probleme mit Firmware-Upgrades für UniFi-Produkte. Das hat sich mit Version 4.0.42.10433 geändert: Ich verzeichne mindestens zwei Probleme mit diesem Upgrade.

DHCP funktioniert mit gewissen Geräten nicht mehr

Bei mir macht dieses Update auf einem UniFi AP-AC-Mesh wie auch auf einem UniFi AP-AC-LR im Zusammenspiel mit DHCP-Anfragen Probleme. Das Resultat: Die Geräte sind zwar im Controller sichtbar, können aber keine IP beziehen.

In der Controller-App für iOS sieht man bei solchen Geräten die Warnung:

„DHCP Timeout. Please check that your DHCP server is accessible and properly configured“

image-8417

Die meisten Geräte wie Laptops, Smartphones und Tablets können mit DHCP IPs beziehen; Probleme haben derzeit nur zwei Geräte(typen) gemacht: Ein Canon Selphy sowie ein Industrieboard für einen Wechselrichter. Meine derzeitige Vermutung: Auf diesen Dingern läuft eine ältere Linux-Version und ein älterer DHCP-Client, der irgendwie nicht (mehr) mit Antworten des DHCP-Servers über UniFi-Komponenten klarkommt, oder UniFi blockiert Antworten auf DHCP-Requests dieser Clients aus irgendeinem Grund.

Das zeigt sich daran, dass in den DHCP-Server-Logs unzählige folgende Meldungen auftauchen:

...
Jun 30 18:16:31 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:17:36 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:17:37 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:18:42 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:18:43 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:19:48 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:19:49 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:20:54 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:20:55 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:22:00 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:22:01 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:23:06 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:23:07 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:24:12 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:24:13 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:25:18 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:25:19 DHCPSERVER dhcpd[19637]: DHCPOFFER on 10.1.2.225 to 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
Jun 30 18:26:24 DHCPSERVER dhcpd[19637]: DHCPDISCOVER from 00:00:00:00:00:00 (SELPHY_DHCP_INSTANCE_0) via eth0
...

Syslog geflutet

Der UniFi AP-AC-Mesh an einem Standort brachte meinen ELK-Cluster für das Sammeln von Syslog-Meldungen aus allen Sites fast zum Glühen, nachdem die neue Firmware installiert war und der Access Point neu gebootet hatte.

Das Gerät sendete folgende Meldung 29 Mal pro Sekunde an den Syslog-Server:

<4> Jun 10 16:00:00 unifi.site.domain.local U7MSH,788a20263e00,v4.0.42.10433 kernel: [103146.842183] [wifi1] FWLOG: [105639111] VDEV_MGR_DEBID_DEFINITION_START ( 0x3, 0x40, 0x1, 0x6 )

Sobald ich wieder die alte Firmware (4.0.21.9965) installiert hatte, hörte die Log-Flut auf.

In Kibana ist die Flutwelle gut ersichtlich …

image-8418

… welche sich auch in der CPU-Auslastung wiederspiegelt:

image-8419

Auch Smokeping zeigt, dass das Gerät mit dem neuen Firmware eine deutlich höhere Latenz bei ICMP Ping Requests aufweist:

image-8420

Ein anderer Benutzer hatte dieses Phänomen bereits im März 2019 beobachtet und dies in einem Beitrag im offiziellen Support-Forum kundgetan: WAL_DBGID_SECURITY_ALLOW_DATA and VDEV_MGR_DEBID_DEFINITION_START — leider ohne Lösung.

Um das Problem ohne Downgrade des Firmwares zu beheben, habe ich meine rsyslog-Konfiguration, welche die Meldungen lokal in Empfang nimmt und an ELK weiterleitet, folgendermassen angepasst:

/etc/rsyslog.conf

...
# EMERGENCY 2019-06-10
if $msg contains 'VDEV_MGR_DEBID_DEFINITION_START' then {
    /dev/null
    stop
}

# Send all logs to ELK server
*.* @10.1.2.3:514
...

Tags: , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Mittwoch, 26. Juni 2019

Das iPhone XS mit eSIM („Dual SIM“) ist für Weltenbummler ein Traum. Heute: USA-Reisen

Gestern Dienstag-Morgen bin ich von einem Kurztrip aus den USA zurückgekehrt.

Seit Jahren habe ich mir auf solchen Reisen gleich nach der Ankunft im nächsten T-Mobile-Laden jeweils eine T-Mobile Pay as you go Pre-Paid SIM-Karte gekauft und in meinem iPhone betrieben.

Mit einer solchen SIM-Karte kann ich innerhalb der USA telefonieren und (ortsabhängig schnelles und zuverlässiges) Internet geniessen, ohne dass ich bei meiner Rückkehr Sorgen um meine Telefonrechnung mit horrenden Roaming-Kosten machen muss.

Für 50 Dollar (plus die lokalen Steuern) erhält man für 30 Tage unlimitertes Internet mit LTE-Geschwindigkeit, unlimitierte SMS (braucht die noch jemand?) und unlimitierte Telefonate im us-amerikanischen Inland und einigen zugewandten Orten.

Da ich mir im Frühjahr 2019 beim Auszug des Media Markts aus der Markthalle in Bern verdammt Glück hatte und das letzte iPhone XS (Ausstellungsgerät) mit 30 Prozent Rabatt ergattern konnte, erfolgte bei diesem ersten Langstrecken-Trip in dem Jahr die Premiere: Ich wollte die Dual SIM-Funktion des iPhone XS verwenden und die virtuelle SIM-Karte bereits hier in der Schweiz zu Hause auf das Telefon draufladen. Das klappte (fast) problemlos:

Voraussetzungen

  • Ein eSIM-fähiges iPhone (sprich derzeit, d.h. im Juni 2019: ein iPhone XS, iPhone XS Plus oder ein iPhone XR)
  • Die iPhone-App T-Mobile eSIM
  • Eine Kreditkarte (VISA, Mastercard)

Schnellanleitung

Das iPhone benötigt eine Internet-Verbindung (d.h. WiFi, evtl. klappt es auch über 4G). Die App starten, laaange Warten, bis die Telefon-Hardware identifiziert wurde, einen Plan auswählen, die angezeigten Formulare ausfüllen (als US-Postleitzahl gebe ich die Postleitzahl des Heimatortes meiner Frau ein — diese PLZ wird meines Wissens nur verwendet, um die Vorwahl der T-Mobile Mobiltelefonnummer festzulegen), die (schweizerische) Rechnungsadresse eingeben, mit Kreditkarte bezahlen — et voilà, es erscheint eine Erfolgsmeldung mitsamt der neu zugewiesenen US-Mobiltelefonnummer.

Tipps

Planwahl Für den viertägigen Tripp habe ich den Simply Prepaid-Plan für $40 ausgewählt, welcher 30 Tage lang gültig ist und u.a. 10 GB Daten zur Verfügung stellt. Es gäbe auch noch einen expliziten Touristenplan für $30, der bringt aber nur 2 GB Daten mit, welche nach 21 Tagen verfallen. Für einen Heavy User wie mich unbrauchbar.

Als Referenz: Von Donnerstag-Abend (ca. 20:30 Uhr) bis Montag-Abend (ca. 18 Uhr) habe ich 3.1 GB Daten verbraten; und das ist eher wenig, weil ich die Hotel-WiFis immer verwendet habe und oft im Power Save-Modus unterwegs war, der Netzwerktransfers einschränkt.

Benennung der Linien und korrekte Konfiguration im Heimat- und Zielland:Ab sofort taucht die eSIM unter Settings > Mobile Data auf. Dort konfiguriert man die zwei verfügbaren Linien. Als erstes habe ich ihnen aussagekräftige Labels gegeben; d.h. „Switzerland“ und „USA“, indem ich die Einträge unter Data Plans angeklickt und das Feld Data Plan Label angepasst habe. Der Anfangsbuchstabe wird verwendet, um die Linien zu identizifizeren: Dies erfolgt visuell mit einem rechteckigen, grauen Böxchen, in welchem der Anfangsbuchstabe der Linie steht; bspw. in der Phone-App, damit man sieht, über welche Linie ein Anruf reingekommen oder rausgegangen ist. Bei mir also „S“ für Switzerland, und „U“ für USA.

Sobald man in den USA gelandet ist, stellt man in den iPhone-Einstellungen unter General > Mobile Data Folgendes ein:

  • Default Voice Line: USA
  • Mobile Data: USA

In der Schweiz sind die Einstellungen gerade umgekehrt (beide Male „Switzerland“); hier empfiehlt es sich zudem, den USA Data Plan auf „Off“ zu schalten, damit T-Mobile und die Amis nicht orten können, wo man sich in der Schweiz bewegt (vielleicht frisst das auch weniger Batterie?).

image-8398

Fallstricke

Es lief (fast) alles wie am Schnürchen. Wer es mir nachmachen will, sollte aber Folgendes beachten:

  1. Die Schweiz kann nicht als Herkunftsland der Kreditkarte ausgewählt werden. Ich habe stattdessen „Germany“ ausgewählt, die Schweizer PLZ eingegeben (vierstellig ist OK), und die Zahlung lief mit meiner Credit Suisse Bonviva VISA durch.
  2. Ich konnte den Betrag mit meiner für Auslandzahlungen bevorzugten Revolut-Kreditkarte nicht bezahlen. Dies könnte aber damit zusammenhängen, dass ich beim ersten Versuch zuerst mangels „Switzerland“ stattdessen „United Kingdom“ als Herkunftsland der Kreditkarte ausgewählt hatte (und nicht Deutschland, wie später mit der Credit Suisse Bonviva Kreditkarte). Sehr unwissenschaftlich: Beim zweiten Versuch zwei Faktoren anpassen und dann nicht sicher sein, welcher tatsächlich den Ausschlag gegeben hat. Die (zurückgewiesene) Zahlungsanfrage erschien jedenfalls gar nicht erst in der Revolut-App.
  3. Die App erschien mir sehr langsam und hakelig. Scheitert die Registration, muss man wieder komplett von Vorne beginnen und alle Formulare erneut ausfüllen — sehr mühsam. Zum Glück muss man sich mit der App im besten Fall nur für ca. fünf Minuten abmühen, und sie dann nie mehr öffnen.

Vorteile der eSIM

  • Die Schweizer Nummer bleibt aktiv; wenn mich jemand telefonisch kontaktieren will, klingelt das Telefon auch in den USA und es werden auch SMS aus der Schweiz angezeigt
  • Weder iMessage noch WhatsApp fordern einen auf, die Telefonnummer anzupassen — weder bei der Ankunft im Ferienland, noch bei der Rückkehr in der Schweiz

Tags: , , , , , , ,
Labels: Reisen, USA

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 26. Juni 2019

Trump bringt mit seinem Win-Lose-Ansatz die Win-Winler in die Bredouille

Heute kam ich bei einem Mittagessen mit einem Juristen auf das Thema Verhandlungstechnik zu sprechen.

Ich erzählte ihm, wie ich als Student als Vorbereitung auf mehrere internationale Model United Nations MUN-Anlässe an Seminaren von Prof. Felix Addor zur Verhandlungsführung teilgenommen habe. Dort wurde uns das vom Harvard Negotiation Project entwickelte Harvard-Konzept (engl. „Getting to Yes“) nahegelegt. Wenn ich mich korrekt erinnere, wird in der Verhandlungstechnik ein Win-Win-Resultat für beide Verhandlungspartner angestrebt. Sehr viele Juristen wie auch Diplomaten haben diese Verhandlungstechnik internalisiert.

Das Problem ist, dass man mit diesen Ansätzen gegen einen Herrn Trump nicht ankommt, da dieser auf Win-Lose spielt. Und spielt der Präsident der letzten verbliebenen Weltmacht mit dieser Taktik, haben die Win-Winler einen schweren Stand.

Mein Gesprächspartner verwies auf Matthias Schranner, Gründer des Schranner Negotiation Institutes, der sozusagen als Gegenpol die Win-Lose-Verhandlungstechnik lehrt. Und er schafft es eloquent, uns Konsensliebenden die Verhandlungstaktik des Herrn Trump zu erläutern — und ihm eine Logik und Intelligenz zuzuschreiben, welche ihm viele Leitmedien absprechen:

Wer sich dafür interessiert: Die zwei Verhandlungstechniken werden auch in Artikeln des Tagesanzeigers näher vorgestellt („Die Kunst der friedlichen Einigung“, 30. September 2013).

Doch gemäss Matthias Schranner hat Trump vor etwas mehr als einem Jahr seinen ersten grossen Fehler begangen, als er den Iranern vom Verhandlungstisch davon lief. Trotz Abschuss einer US-Drohne hat Trump entschieden, derzeit nicht gegen den Iran in den Krieg zu ziehen. Ob dies eine späte Nachwehe seines Entscheids vom Mai 2018 ist?

Tags: , , , , , , , , , , , ,
Labels: Studium, USA

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 9. Juni 2019

Meine Sauna-Ausrüstung

Letzten Sommer entdeckten Stephanie und ich die Bernaqua-Aktion „Sommerpass“, die einem über die schwach besuchten Sommermonate für 199 CHF während zwei Monaten all-inclusive-Zugang zum Bernaqua (Erlebnisbad, Fitness, Sauna) erlaubt.

Heuer gibt es die Aktion übrigens auch wieder (verfügbar noch bis zum Starttermin 23. Juni 2019). Der Pass erlaubt dieses Mal sogar den Eintritt in andere Fitness-Center des Unternehmens. Wer also das nötige Kleingeld besitzt, während den Sommermonaten nicht oder nur wenig in die Ferien verreist oder aus anderen Gründen an den Standort Bern gebunden ist: Zuschlagen!

Im November des letzten Jahres entscheid ich mich nach den positiven Erfahrungen aus der Sommeraktion, ein Ganzjahres-Abonnement für den Fitnesspark zu lösen. Dank dem Beitrag meiner Krankenkasse kostet mich ein solches Abonnement „nur“ 900 CHF/Jahr — und da ich mich gleichzeitig für die MIGROS Fitnesscard entschieden habe, kann ich alle Wellness- und Fitnesscenter des Unternehmens in der Schweiz kostenlos besuchen. Ein No-Brainer!

Ich bin ein grosser Fan der gemischten Saunalandschaft im Bernaqua geworden. Was mir aufgefallen ist: Im Winter war ich kein einziges Mal krank und musste der Arbeit fehlbleiben. Ich schreibe dies primär den regelmässigen Saunagängen im Bernaqua zu.

Man sollte aber gewarnt sein: So wenig Volk wie im Juli und August trifft man das restliche Jahr hinüber in der Sauna nie mehr an; in den Wintermonaten wird es regelmässig sehr, sehr eng bei den stündlich stattfindenden Aufgüssen.

Doch was bringe ich jeweils mit in die Saunalandschaft? Hier meine persönliche Liste:

Tasche

Inspiriert durch die Zimmerausstattung im Wellnesshotel Rovanada in Vals habe ich mir letztes Jahr bei Brack mehrere Koziol Taschen XL gekauft. Aus wirklich starrem Plastic erscheinen sie mir perfekt, um den restlichen, nachfolgend aufgeführten Plunder in der Wohnung zu lagern und dann mit einem Handgriff ins Fitnesscenter mitzubringen.

Schuhwerk

Einerseits bringe ich seitjeher Havaianas Flip Flops mit ins Fitnesscenter. Mich hat aber zunehmends gestört, dass man „beim Einstieg“ in die Flip Flops immer so genau zielen muss, damit der Haltebändel zwischen dem grossen und dem nachfolgenden Zeh landet.

Ich habe mir deshalb bei Dosenbach Crocs-Imitate gekauft: HERREN CLOG. Sieht zugegebenermassen scheisse aus, sind aber viel einfacher anzuziehen und angenehm zu tragen.

Bademantel

Fast hätte ich seinerzeit bei Globus im Westside einen überteuerten Markenbademantel gekauft, der mir weder gut gesessen noch vom Stoff her gefallen hat (viel zu schwer, dick).

Glücklicherweise stellte ich den Kauf zurück, wanderte in die benachbarte H&M-Filiale und fand ihn, den perfekten, leichten, sehr stylischen Bademantel: Bademantel in Waffeloptik, Helles Taupe (ZUSAMMENSETZUNG Polyester 50%, Baumwolle 50% ART.- NR.0346942015). Er erinnert mich an einen japanischen Kimono.

Da mein Modell kurze Ärmel aufweist (ich bin mir nicht sicher, ob das oben verlinkte Modell wirklich meinem Bademantel entspricht — ich glaube das oben ist die Langarmversion), habe ich den Bademantel eine Nummer grösser gekauft: L/XL. Schaut meiner Meinung nach perfekt aus; die Ärmel kommen mir fast bis zu den Ellbogen.

Tücher

Erst wenn man die Sauna öfters besucht, merkt man, wie wichtig geeignete Tücher sind.

Ich erwähne diese explizit im Plural, weil ich mittlerweile nur mehr mit zwei Tüchern in die Sauna gehe: Blau (= kalte „Anwendung“; sauber), um mich nach den Duschen/Bädern zu trocknen; Rot/Orange (= heisse „Anwendung“; dreckig), um mich in einer Sauna darauf hinzulegen und meinen Schweiss aufzufangen.

Man könnte sich dafür die seit Jahren im Trend liegenden Hamamtücher leisten (ich habe auch vor langer, langer Zeit über Lieferanten berichtet).

Stattdessen habe ich dem Vernehmen nach saugkräftigere Leinentücher gesucht — und gefunden.

Das Hipster-Produkt von Outlier NYC war mir dafür aber deutlich zu teuer.

Dank Reddit wurde ich auf einen Lieferanten aus Europa aufmerksam: Ich habe mir bei Linenfiesta aus Litauen über Etsy zwei reine Leinentücher im Waffeldesign in den Dimensionen 160 × 100 Zentimeter geleistet (ACHTUNG: Es fallen Zollgebühren an, wenn der Warenwert inklusive Portokosten 5 CHF Mehrwertsteuer übersteigt).

Das blaue Tuch ist mir für das Abtrocknen nach der Dusche doch etwas zu gross (und berührte gelegentlich den Boden), weshalb derzeit gerade ein Tuch in der Dimension 70 × 130 Zentimeter auf dem Weg in die Schweiz ist.

Die Tücher rolle ich nach der Benutzung jeweils zusammen. Von Outlier NYC inspiriert habe ich mir hierzu auf Aliexpress entsprechende „Luggage Straps“ mit Buckle bestellt, die die zusammengerollten Tücher umschliessen und zusammengerollt lassen: THINKTHENDO Adjustable Suitcase Bag Travel Luggage Straps Buckle Baggage Tie Down Belt Lock 4 Color.

Necessaire

Als Necessaire verwende ich ein Werbegeschenk von Victorinox (ein sog. „Amenity Kit“), welches Stephanie vor einiger Zeit auf einem SWISS Business-Langstreckenflug erhalten hat.

Darin kann ich mein iPhone, meine Airpods sowie (in einem Ziploc-Sack) mein kleines Douche verstauen und mit in den Saunabereich nehmen.

Mir gefällt insbesondere das elastische Band mit Druckknopf, mit welchem sich das Etui schliessen lässt und so unterschiedliche Füllmengen zulässt.

Apple Watch

Seit ich die Apple Watch Series 4 besitze, welche wasserfest ist, bringe ich diese auf meine Saunagänge mit.

Ich bin nun mal eine Person, die zwar auf das Körpergefühl hört, aber trotzdem eine immer ähnlich lange Zeit in einer Sauna verbringen möchte. Deshalb kommt die Uhr immer mit und ich verwende sie, um meine — je nach Tagesform — 8 bis 12 Minuten abzusitzen. Weiterer Vorteil: Zusammen mit den über Bluetooth gekoppelten Apple Airpods kann man in der Ruhezone zu selbst ausgewählter beruhigender Musik entspannen (und gelegentlich einschlafen). Falls man einschläft, hilft der Timer der Uhr auch, dass man rechtzeitig vor dem Aufguss aufwacht …

Von den Diskussionen drüben bei vowe geleitet habe ich mir für Wassersport und Sauna das 44 mm Sport Loop, Muschel geleistet. Dieses soll im Vergleich zu den Silikonbändern rascher trocknen (irgendwie steht in den Kommentaren bei vowe zwar das Gegenteil — war wohl spät am Abend, als ich den Blog konsultiert habe?). A propos: Interessante Fragestellung. Ich trage mein Band wie auf dem zweiten Bild; d.h. Schlaufe unten.

Von Metallarmbändern rate ich ab, ausser man steht auf den Geruch von verbranntem Fleisch und potentiellen Brandings … *zwinker*

Und ja, meine Stainless Steel Apple Watch 4 hat bisher noch jeden Saunagang überlebt, ohne je einmal den Hitzealarm anzuzeigen und herunterzufahren.

Tags: , , , , , , , , , , , , ,
Labels: Leben, Schweiz, Shopping

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 9. Juni 2019

Thoughts on Apple’s Find my (English)

(A friend of mine living in the US asked me about my thoughts on Apple’s upcoming Find my app announced at WWDC 2019 this week — that’s why this article is posted in English)

Links (preliminary reads)

My thoughts

In short: Very, very, very useful.

Once rolled out, this feature will help a lot of devices to be returned to their rightful owner, and probably will also lead to some arrests over times, as well as some very weird discussions with friends and family («Brother-in-law, I know my iPhone is in your house! What the f*** were you thinking?») …

Oh, and think about missing persons, unconscious or incapable of calling for help. You MIGHT find them as long as they’re not totally off the beaten track, even if they don’t have mobile reception. Interesting to see whether good hackers will try to improve their antenna designs to catch Bluetooth signals from miles away (if this is even physically and technically possible?).

Of course, this feature only works as long as your phone is charged, switched on and not damaged (as in hard- and/or software issues). A while ago, a friend lost his phone when „not fully sober“ in front of his condo’s building on a night it was snowing heavily. He found it two days later when the snow melted (after an oven session the thing switched on again and still works, yay!) … this technology would have helped him find it (probably) the morning after, when the phone still had a charge — given that he had access to a second device able to receive the Bluetooth beacon (or another person living in the neighbourhood passing by with his Apple device).

Some questions currently remain open:

  1. How safe is it? In theory it sounds bullet proof. My biggest fear is that hackers nevertheless might find vulnerabilities in the implementation once it is in the wild — looking at you, 36C3 and Def Con. I hope Apple will be able to fix such vulnerabilities with a quick software update …
  2. Does the Bluetooth beacon signal continue to work when Airplane mode is activated? I don’t see airlines tolerate Apple devices sending Bluetooth beacons on an airplane during start and landing. So the Apple devices will have to respect an activated Airplane Mode. If implemented this way, as an unwanted side effect, it will lead malicious persons to switch the device to Airplane Mode (works for iPhones and iPads, but not MacBooks AFAIK) immediately after finding/stealing it, to prevent the device to broadcasting it’s location. On a sidenote: If a device is NOT switched to Airplane mode and such beacons are caught by other devices during a flight, this would give some weird location readings :-)
  3. Will Apple extend this feature to a yet-to-be-introduced tag-like device, as in Bluetooth tiles? Then your tracking might not be limited to a phone anymore, but to anything that can be attached to something (e.g. Bluetooth tile to your keychain, sports bag, backpack etc.). This will totally crush the market for such tiles, because you won’t have to install a tile-specific app on your phone, let it run in the background on your device and hope that other people passing by the lost item also run the very same app to catch your tile’s distress signal …

Tags: , , , , , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen